update config dependency (#11611)
This PR does a couple of things that I couldn't quite split up so I put together a PR w/ individual commits to help reviewers get through it. This PR does the following: 1. update `go.opentelemetry.io/contrib/config` package to latest. this brings in breaking changes. in order to prevent those breaking changes from impacting end users, i've also added a layer of config unmarshaling 2. updates the collector to instantiate the meter provider (and exporters) via the config package. this allows us to remove all the code in `otelinit`. the reason for including this change was that unmarshaling the config was causing circular dependencies i didn't want to address by moving code that could be deleted around. Replacement for https://github.com/open-telemetry/opentelemetry-collector/pull/11458. Fixes https://github.com/open-telemetry/opentelemetry-collector/issues/12021 --------- Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									2447a81885
								
							
						
					
					
						commit
						4edaacddf9
					
				| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					# Use this changelog template to create an entry for release notes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
 | 
				
			||||||
 | 
					change_type: enhancement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
 | 
				
			||||||
 | 
					component: service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# A brief description of the change.  Surround your text with quotes ("") if it needs to start with a backtick (`).
 | 
				
			||||||
 | 
					note: remove custom code and instead use config package to instantiate meter provider.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# One or more tracking issues or pull requests related to the change
 | 
				
			||||||
 | 
					issues: [11611]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# (Optional) One or more lines of additional information to render under the primary note.
 | 
				
			||||||
 | 
					# These lines will be padded with 2 spaces and then inserted directly into the document.
 | 
				
			||||||
 | 
					# Use pipe (|) for multiline entries.
 | 
				
			||||||
 | 
					subtext:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Optional: The change log or logs in which this entry should be included.
 | 
				
			||||||
 | 
					# e.g. '[user]' or '[user, api]'
 | 
				
			||||||
 | 
					# Include 'user' if the change is relevant to end users.
 | 
				
			||||||
 | 
					# Include 'api' if there is a change to a library API.
 | 
				
			||||||
 | 
					# Default: '[user]'
 | 
				
			||||||
 | 
					change_logs: []
 | 
				
			||||||
| 
						 | 
					@ -123,26 +123,27 @@ require (
 | 
				
			||||||
	go.opentelemetry.io/collector/semconv v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/semconv v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/collector/service v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/service v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
 | 
						go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/config v0.10.0 // indirect
 | 
						go.opentelemetry.io/contrib/config v0.14.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
 | 
						go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
 | 
						go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/propagators/b3 v1.34.0 // indirect
 | 
						go.opentelemetry.io/contrib/propagators/b3 v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/zpages v0.59.0 // indirect
 | 
						go.opentelemetry.io/contrib/zpages v0.59.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/log v0.10.0 // indirect
 | 
						go.opentelemetry.io/otel/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/metric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/metric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/trace v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/trace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
						go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,8 +115,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
 | 
				
			||||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
					go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c=
 | 
					go.opentelemetry.io/contrib/config v0.14.0 h1:QAG8uHNp5ZiCkpT7XggSmg5AyW1sA0LgypMoXgBB1+4=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc=
 | 
					go.opentelemetry.io/contrib/config v0.14.0/go.mod h1:77rDmFPqBae5jtQ2C78RuDTHz4P27C8LzoN0MZyumYQ=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
 | 
					go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
 | 
					go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
				
			||||||
| 
						 | 
					@ -127,34 +127,36 @@ go.opentelemetry.io/contrib/zpages v0.59.0 h1:t0H5zUy8fifIhRuVwm2FrA/D70Kk10SSpA
 | 
				
			||||||
go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
					go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
					go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
					go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
					go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
					go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
					go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
					go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
				
			||||||
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
					go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -122,6 +122,9 @@ func checkStructFieldTags(f reflect.StructField) error {
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		fieldTag := tagParts[0]
 | 
							fieldTag := tagParts[0]
 | 
				
			||||||
		if !configFieldTagRegExp.MatchString(fieldTag) {
 | 
							if !configFieldTagRegExp.MatchString(fieldTag) {
 | 
				
			||||||
 | 
								if f.Name == "AdditionalProperties" {
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			return fmt.Errorf(
 | 
								return fmt.Errorf(
 | 
				
			||||||
				"field %q has config tag %q which doesn't satisfy %q",
 | 
									"field %q has config tag %q which doesn't satisfy %q",
 | 
				
			||||||
				f.Name,
 | 
									f.Name,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,25 +102,26 @@ require (
 | 
				
			||||||
	go.opentelemetry.io/collector/receiver/xreceiver v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/receiver/xreceiver v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/collector/semconv v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/semconv v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
 | 
						go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/config v0.10.0 // indirect
 | 
						go.opentelemetry.io/contrib/config v0.14.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
 | 
						go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
 | 
						go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/propagators/b3 v1.34.0 // indirect
 | 
						go.opentelemetry.io/contrib/propagators/b3 v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/log v0.10.0 // indirect
 | 
						go.opentelemetry.io/otel/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/metric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/metric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/trace v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/trace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
						go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,8 +107,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
 | 
				
			||||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
					go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c=
 | 
					go.opentelemetry.io/contrib/config v0.14.0 h1:QAG8uHNp5ZiCkpT7XggSmg5AyW1sA0LgypMoXgBB1+4=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc=
 | 
					go.opentelemetry.io/contrib/config v0.14.0/go.mod h1:77rDmFPqBae5jtQ2C78RuDTHz4P27C8LzoN0MZyumYQ=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
 | 
					go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
 | 
					go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
				
			||||||
| 
						 | 
					@ -119,34 +119,36 @@ go.opentelemetry.io/contrib/zpages v0.59.0 h1:t0H5zUy8fifIhRuVwm2FrA/D70Kk10SSpA
 | 
				
			||||||
go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
					go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
					go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
					go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
					go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
					go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
					go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
					go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
				
			||||||
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
					go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@ import (
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	"go.uber.org/zap/zapcore"
 | 
						"go.uber.org/zap/zapcore"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/component"
 | 
						"go.opentelemetry.io/collector/component"
 | 
				
			||||||
| 
						 | 
					@ -279,7 +279,7 @@ func generateConfig() *Config {
 | 
				
			||||||
					Level: configtelemetry.LevelNormal,
 | 
										Level: configtelemetry.LevelNormal,
 | 
				
			||||||
					Readers: []config.MetricReader{
 | 
										Readers: []config.MetricReader{
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Pull: &config.PullMetricReader{Exporter: config.MetricExporter{
 | 
												Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{
 | 
				
			||||||
								Prometheus: &config.Prometheus{
 | 
													Prometheus: &config.Prometheus{
 | 
				
			||||||
									Host: newPtr("localhost"),
 | 
														Host: newPtr("localhost"),
 | 
				
			||||||
									Port: newPtr(8080),
 | 
														Port: newPtr(8080),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ require (
 | 
				
			||||||
	go.opentelemetry.io/collector/receiver v0.118.0
 | 
						go.opentelemetry.io/collector/receiver v0.118.0
 | 
				
			||||||
	go.opentelemetry.io/collector/receiver/receivertest v0.118.0
 | 
						go.opentelemetry.io/collector/receiver/receivertest v0.118.0
 | 
				
			||||||
	go.opentelemetry.io/collector/service v0.118.0
 | 
						go.opentelemetry.io/collector/service v0.118.0
 | 
				
			||||||
	go.opentelemetry.io/contrib/config v0.10.0
 | 
						go.opentelemetry.io/contrib/config v0.14.0
 | 
				
			||||||
	go.uber.org/goleak v1.3.0
 | 
						go.uber.org/goleak v1.3.0
 | 
				
			||||||
	go.uber.org/multierr v1.11.0
 | 
						go.uber.org/multierr v1.11.0
 | 
				
			||||||
	go.uber.org/zap v1.27.0
 | 
						go.uber.org/zap v1.27.0
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,6 @@ require (
 | 
				
			||||||
	github.com/cespare/xxhash/v2 v2.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.1 // indirect
 | 
				
			||||||
	github.com/ebitengine/purego v0.8.1 // indirect
 | 
						github.com/ebitengine/purego v0.8.1 // indirect
 | 
				
			||||||
	github.com/felixge/httpsnoop v1.0.4 // indirect
 | 
					 | 
				
			||||||
	github.com/go-logr/logr v1.4.2 // indirect
 | 
						github.com/go-logr/logr v1.4.2 // indirect
 | 
				
			||||||
	github.com/go-logr/stdr v1.2.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.2.6 // indirect
 | 
				
			||||||
| 
						 | 
					@ -88,24 +87,23 @@ require (
 | 
				
			||||||
	go.opentelemetry.io/collector/receiver/xreceiver v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/receiver/xreceiver v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/collector/semconv v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/semconv v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
 | 
						go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
 | 
					 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
 | 
					 | 
				
			||||||
	go.opentelemetry.io/contrib/propagators/b3 v1.34.0 // indirect
 | 
						go.opentelemetry.io/contrib/propagators/b3 v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/log v0.10.0 // indirect
 | 
						go.opentelemetry.io/otel/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/metric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/metric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/trace v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/trace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
						go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,10 +113,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
 | 
				
			||||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
					go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c=
 | 
					go.opentelemetry.io/contrib/config v0.14.0 h1:QAG8uHNp5ZiCkpT7XggSmg5AyW1sA0LgypMoXgBB1+4=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc=
 | 
					go.opentelemetry.io/contrib/config v0.14.0/go.mod h1:77rDmFPqBae5jtQ2C78RuDTHz4P27C8LzoN0MZyumYQ=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
 | 
					 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
 | 
					 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
 | 
				
			||||||
go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8=
 | 
					go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8=
 | 
				
			||||||
| 
						 | 
					@ -125,34 +123,36 @@ go.opentelemetry.io/contrib/zpages v0.59.0 h1:t0H5zUy8fifIhRuVwm2FrA/D70Kk10SSpA
 | 
				
			||||||
go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
					go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
					go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
					go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
					go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
					go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
					go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
					go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
				
			||||||
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
					go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,6 @@ require (
 | 
				
			||||||
	github.com/cespare/xxhash/v2 v2.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.1 // indirect
 | 
				
			||||||
	github.com/ebitengine/purego v0.8.1 // indirect
 | 
						github.com/ebitengine/purego v0.8.1 // indirect
 | 
				
			||||||
	github.com/felixge/httpsnoop v1.0.4 // indirect
 | 
					 | 
				
			||||||
	github.com/go-logr/logr v1.4.2 // indirect
 | 
						github.com/go-logr/logr v1.4.2 // indirect
 | 
				
			||||||
	github.com/go-logr/stdr v1.2.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.2.6 // indirect
 | 
				
			||||||
| 
						 | 
					@ -86,25 +85,24 @@ require (
 | 
				
			||||||
	go.opentelemetry.io/collector/receiver/xreceiver v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/receiver/xreceiver v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/collector/semconv v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/semconv v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
 | 
						go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/config v0.10.0 // indirect
 | 
						go.opentelemetry.io/contrib/config v0.14.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect
 | 
					 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
 | 
					 | 
				
			||||||
	go.opentelemetry.io/contrib/propagators/b3 v1.34.0 // indirect
 | 
						go.opentelemetry.io/contrib/propagators/b3 v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/log v0.10.0 // indirect
 | 
						go.opentelemetry.io/otel/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/metric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/metric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/trace v1.34.0 // indirect
 | 
						go.opentelemetry.io/otel/trace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
						go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
				
			||||||
| 
						 | 
					@ -138,12 +136,6 @@ replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/con
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace go.opentelemetry.io/collector/processor => ../../processor
 | 
					replace go.opentelemetry.io/collector/processor => ../../processor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace go.opentelemetry.io/collector/processor/processortest => ../../processor/processortest
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
replace go.opentelemetry.io/collector/confmap => ../../confmap
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
replace go.opentelemetry.io/collector/pdata => ../../pdata
 | 
					replace go.opentelemetry.io/collector/pdata => ../../pdata
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile
 | 
					replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile
 | 
				
			||||||
| 
						 | 
					@ -221,3 +213,9 @@ replace go.opentelemetry.io/collector/extension/extensiontest => ../../extension
 | 
				
			||||||
replace go.opentelemetry.io/collector/extension/auth/authtest => ../../extension/auth/authtest
 | 
					replace go.opentelemetry.io/collector/extension/auth/authtest => ../../extension/auth/authtest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension
 | 
					replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					replace go.opentelemetry.io/collector/confmap => ../../confmap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					replace go.opentelemetry.io/collector/processor/processortest => ../../processor/processortest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,10 +113,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
 | 
				
			||||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
					go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c=
 | 
					go.opentelemetry.io/contrib/config v0.14.0 h1:QAG8uHNp5ZiCkpT7XggSmg5AyW1sA0LgypMoXgBB1+4=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc=
 | 
					go.opentelemetry.io/contrib/config v0.14.0/go.mod h1:77rDmFPqBae5jtQ2C78RuDTHz4P27C8LzoN0MZyumYQ=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
 | 
					 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
 | 
					 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
 | 
				
			||||||
go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8=
 | 
					go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8=
 | 
				
			||||||
| 
						 | 
					@ -125,34 +123,36 @@ go.opentelemetry.io/contrib/zpages v0.59.0 h1:t0H5zUy8fifIhRuVwm2FrA/D70Kk10SSpA
 | 
				
			||||||
go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
					go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
					go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
					go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
					go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
					go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
					go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
					go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
				
			||||||
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
					go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -157,7 +157,7 @@ func TestServiceUnmarshalError(t *testing.T) {
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
			expectError: "error decoding 'telemetry': decoding failed due to the following error(s):\n\nerror decoding 'logs.level': unrecognized level: \"UNKNOWN\"",
 | 
								expectError: "error decoding 'telemetry': decoding failed due to the following error(s):\n\nerror decoding 'logs': decoding failed due to the following error(s):\n\nerror decoding 'level': unrecognized level: \"UNKNOWN\"",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "invalid-metrics-level",
 | 
								name: "invalid-metrics-level",
 | 
				
			||||||
| 
						 | 
					@ -168,7 +168,7 @@ func TestServiceUnmarshalError(t *testing.T) {
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			}),
 | 
								}),
 | 
				
			||||||
			expectError: "error decoding 'telemetry': decoding failed due to the following error(s):\n\nerror decoding 'metrics.level': unknown metrics level \"unknown\"",
 | 
								expectError: "error decoding 'telemetry': decoding failed due to the following error(s):\n\nerror decoding 'metrics': decoding failed due to the following error(s):\n\nerror decoding 'level': unknown metrics level \"unknown\"",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name: "invalid-service-extensions-section",
 | 
								name: "invalid-service-extensions-section",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,24 +4,31 @@
 | 
				
			||||||
package service // import "go.opentelemetry.io/collector/service"
 | 
					package service // import "go.opentelemetry.io/collector/service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	sdkresource "go.opentelemetry.io/otel/sdk/resource"
 | 
						sdkresource "go.opentelemetry.io/otel/sdk/resource"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/service/telemetry"
 | 
						"go.opentelemetry.io/collector/service/telemetry"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func attributes(res *sdkresource.Resource, cfg telemetry.Config) map[string]any {
 | 
					func attributes(res *sdkresource.Resource, cfg telemetry.Config) []config.AttributeNameValue {
 | 
				
			||||||
	attrs := map[string]any{}
 | 
						attrsMap := map[string]any{}
 | 
				
			||||||
	for _, r := range res.Attributes() {
 | 
						for _, r := range res.Attributes() {
 | 
				
			||||||
		attrs[string(r.Key)] = r.Value.AsString()
 | 
							attrsMap[string(r.Key)] = r.Value.AsString()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for k, v := range cfg.Resource {
 | 
						for k, v := range cfg.Resource {
 | 
				
			||||||
		if v != nil {
 | 
							if v != nil {
 | 
				
			||||||
			attrs[k] = *v
 | 
								attrsMap[k] = *v
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			// the new value is nil, delete the existing key
 | 
								// the new value is nil, delete the existing key
 | 
				
			||||||
			delete(attrs, k)
 | 
								delete(attrsMap, k)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var attrs []config.AttributeNameValue
 | 
				
			||||||
 | 
						for k, v := range attrsMap {
 | 
				
			||||||
 | 
							attrs = append(attrs, config.AttributeNameValue{Name: k, Value: v})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return attrs
 | 
						return attrs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@ import (
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/component"
 | 
						"go.opentelemetry.io/collector/component"
 | 
				
			||||||
	"go.opentelemetry.io/collector/service/internal/resource"
 | 
						"go.opentelemetry.io/collector/service/internal/resource"
 | 
				
			||||||
| 
						 | 
					@ -18,46 +19,50 @@ func TestAttributes(t *testing.T) {
 | 
				
			||||||
		name           string
 | 
							name           string
 | 
				
			||||||
		cfg            telemetry.Config
 | 
							cfg            telemetry.Config
 | 
				
			||||||
		buildInfo      component.BuildInfo
 | 
							buildInfo      component.BuildInfo
 | 
				
			||||||
		wantAttributes map[string]any
 | 
							wantAttributes []config.AttributeNameValue
 | 
				
			||||||
	}{
 | 
						}{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name:           "no build info and no resource config",
 | 
								name:           "no build info and no resource config",
 | 
				
			||||||
			cfg:            telemetry.Config{},
 | 
								cfg:            telemetry.Config{},
 | 
				
			||||||
			wantAttributes: map[string]any{"service.name": "", "service.version": "", "service.instance.id": ""},
 | 
								wantAttributes: []config.AttributeNameValue{{Name: "service.name", Value: ""}, {Name: "service.version", Value: ""}, {Name: "service.instance.id", Value: ""}},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name:           "build info and no resource config",
 | 
								name:           "build info and no resource config",
 | 
				
			||||||
			cfg:            telemetry.Config{},
 | 
								cfg:            telemetry.Config{},
 | 
				
			||||||
			buildInfo:      component.BuildInfo{Command: "otelcoltest", Version: "0.0.0-test"},
 | 
								buildInfo:      component.BuildInfo{Command: "otelcoltest", Version: "0.0.0-test"},
 | 
				
			||||||
			wantAttributes: map[string]any{"service.name": "otelcoltest", "service.version": "0.0.0-test", "service.instance.id": ""},
 | 
								wantAttributes: []config.AttributeNameValue{{Name: "service.name", Value: "otelcoltest"}, {Name: "service.version", Value: "0.0.0-test"}, {Name: "service.instance.id", Value: ""}},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name:           "no build info and resource config",
 | 
								name:           "no build info and resource config",
 | 
				
			||||||
			cfg:            telemetry.Config{Resource: map[string]*string{"service.name": newPtr("resource.name"), "service.version": newPtr("resource.version"), "test": newPtr("test")}},
 | 
								cfg:            telemetry.Config{Resource: map[string]*string{"service.name": ptr("resource.name"), "service.version": ptr("resource.version"), "test": ptr("test")}},
 | 
				
			||||||
			wantAttributes: map[string]any{"service.name": "resource.name", "service.version": "resource.version", "test": "test", "service.instance.id": ""},
 | 
								wantAttributes: []config.AttributeNameValue{{Name: "service.name", Value: "resource.name"}, {Name: "service.version", Value: "resource.version"}, {Name: "test", Value: "test"}, {Name: "service.instance.id", Value: ""}},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name:           "build info and resource config",
 | 
								name:           "build info and resource config",
 | 
				
			||||||
			buildInfo:      component.BuildInfo{Command: "otelcoltest", Version: "0.0.0-test"},
 | 
								buildInfo:      component.BuildInfo{Command: "otelcoltest", Version: "0.0.0-test"},
 | 
				
			||||||
			cfg:            telemetry.Config{Resource: map[string]*string{"service.name": newPtr("resource.name"), "service.version": newPtr("resource.version"), "test": newPtr("test")}},
 | 
								cfg:            telemetry.Config{Resource: map[string]*string{"service.name": ptr("resource.name"), "service.version": ptr("resource.version"), "test": ptr("test")}},
 | 
				
			||||||
			wantAttributes: map[string]any{"service.name": "resource.name", "service.version": "resource.version", "test": "test", "service.instance.id": ""},
 | 
								wantAttributes: []config.AttributeNameValue{{Name: "service.name", Value: "resource.name"}, {Name: "service.version", Value: "resource.version"}, {Name: "test", Value: "test"}, {Name: "service.instance.id", Value: ""}},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			name:           "deleting a nil value",
 | 
								name:           "deleting a nil value",
 | 
				
			||||||
			buildInfo:      component.BuildInfo{Command: "otelcoltest", Version: "0.0.0-test"},
 | 
								buildInfo:      component.BuildInfo{Command: "otelcoltest", Version: "0.0.0-test"},
 | 
				
			||||||
			cfg:            telemetry.Config{Resource: map[string]*string{"service.name": nil, "service.version": newPtr("resource.version"), "test": newPtr("test")}},
 | 
								cfg:            telemetry.Config{Resource: map[string]*string{"service.name": nil, "service.version": ptr("resource.version"), "test": ptr("test")}},
 | 
				
			||||||
			wantAttributes: map[string]any{"service.version": "resource.version", "test": "test", "service.instance.id": ""},
 | 
								wantAttributes: []config.AttributeNameValue{{Name: "service.version", Value: "resource.version"}, {Name: "test", Value: "test"}, {Name: "service.instance.id", Value: ""}},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, tt := range tests {
 | 
						for _, tt := range tests {
 | 
				
			||||||
		t.Run(tt.name, func(t *testing.T) {
 | 
							t.Run(tt.name, func(t *testing.T) {
 | 
				
			||||||
			attrs := attributes(resource.New(tt.buildInfo, tt.cfg.Resource), tt.cfg)
 | 
								attrs := attributes(resource.New(tt.buildInfo, tt.cfg.Resource), tt.cfg)
 | 
				
			||||||
			require.Len(t, attrs, len(tt.wantAttributes))
 | 
								require.Len(t, attrs, len(tt.wantAttributes))
 | 
				
			||||||
			for k, v := range tt.wantAttributes {
 | 
								gotMap := map[string]any{}
 | 
				
			||||||
				if k == "service.instance.id" {
 | 
								for _, v := range attrs {
 | 
				
			||||||
					require.NotNil(t, attrs[k])
 | 
									gotMap[v.Name] = v.Value
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								for _, v := range tt.wantAttributes {
 | 
				
			||||||
 | 
									if v.Name == "service.instance.id" {
 | 
				
			||||||
 | 
										require.NotNil(t, gotMap[v.Name])
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					require.Equal(t, v, attrs[k])
 | 
										require.Equal(t, v.Value, gotMap[v.Name])
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@ import (
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	"go.uber.org/zap/zapcore"
 | 
						"go.uber.org/zap/zapcore"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/component"
 | 
						"go.opentelemetry.io/collector/component"
 | 
				
			||||||
| 
						 | 
					@ -100,7 +100,7 @@ func generateConfig() *Config {
 | 
				
			||||||
				Level: configtelemetry.LevelNormal,
 | 
									Level: configtelemetry.LevelNormal,
 | 
				
			||||||
				Readers: []config.MetricReader{
 | 
									Readers: []config.MetricReader{
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
 | 
											Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{Prometheus: &config.Prometheus{
 | 
				
			||||||
							Host: newPtr("localhost"),
 | 
												Host: newPtr("localhost"),
 | 
				
			||||||
							Port: newPtr(8080),
 | 
												Port: newPtr(8080),
 | 
				
			||||||
						}}},
 | 
											}}},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,6 @@ go 1.22.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/google/uuid v1.6.0
 | 
						github.com/google/uuid v1.6.0
 | 
				
			||||||
	github.com/prometheus/client_golang v1.20.5
 | 
					 | 
				
			||||||
	github.com/prometheus/client_model v0.6.1
 | 
						github.com/prometheus/client_model v0.6.1
 | 
				
			||||||
	github.com/prometheus/common v0.62.0
 | 
						github.com/prometheus/common v0.62.0
 | 
				
			||||||
	github.com/shirou/gopsutil/v4 v4.24.12
 | 
						github.com/shirou/gopsutil/v4 v4.24.12
 | 
				
			||||||
| 
						 | 
					@ -44,15 +43,9 @@ require (
 | 
				
			||||||
	go.opentelemetry.io/collector/receiver/xreceiver v0.118.0
 | 
						go.opentelemetry.io/collector/receiver/xreceiver v0.118.0
 | 
				
			||||||
	go.opentelemetry.io/collector/semconv v0.118.0
 | 
						go.opentelemetry.io/collector/semconv v0.118.0
 | 
				
			||||||
	go.opentelemetry.io/contrib/bridges/otelzap v0.9.0
 | 
						go.opentelemetry.io/contrib/bridges/otelzap v0.9.0
 | 
				
			||||||
	go.opentelemetry.io/contrib/config v0.10.0
 | 
						go.opentelemetry.io/contrib/config v0.14.0
 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0
 | 
					 | 
				
			||||||
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0
 | 
					 | 
				
			||||||
	go.opentelemetry.io/contrib/propagators/b3 v1.34.0
 | 
						go.opentelemetry.io/contrib/propagators/b3 v1.34.0
 | 
				
			||||||
	go.opentelemetry.io/otel v1.34.0
 | 
						go.opentelemetry.io/otel v1.34.0
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0
 | 
					 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0
 | 
					 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/prometheus v0.56.0
 | 
					 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0
 | 
					 | 
				
			||||||
	go.opentelemetry.io/otel/log v0.10.0
 | 
						go.opentelemetry.io/otel/log v0.10.0
 | 
				
			||||||
	go.opentelemetry.io/otel/metric v1.34.0
 | 
						go.opentelemetry.io/otel/metric v1.34.0
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk v1.34.0
 | 
						go.opentelemetry.io/otel/sdk v1.34.0
 | 
				
			||||||
| 
						 | 
					@ -62,7 +55,6 @@ require (
 | 
				
			||||||
	go.uber.org/multierr v1.11.0
 | 
						go.uber.org/multierr v1.11.0
 | 
				
			||||||
	go.uber.org/zap v1.27.0
 | 
						go.uber.org/zap v1.27.0
 | 
				
			||||||
	gonum.org/v1/gonum v0.15.1
 | 
						gonum.org/v1/gonum v0.15.1
 | 
				
			||||||
	google.golang.org/grpc v1.69.4
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
| 
						 | 
					@ -95,6 +87,7 @@ require (
 | 
				
			||||||
	github.com/pierrec/lz4/v4 v4.1.22 // indirect
 | 
						github.com/pierrec/lz4/v4 v4.1.22 // indirect
 | 
				
			||||||
	github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
						github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
				
			||||||
	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
 | 
						github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
 | 
				
			||||||
 | 
						github.com/prometheus/client_golang v1.20.5 // indirect
 | 
				
			||||||
	github.com/prometheus/procfs v0.15.1 // indirect
 | 
						github.com/prometheus/procfs v0.15.1 // indirect
 | 
				
			||||||
	github.com/rs/cors v1.11.1 // indirect
 | 
						github.com/rs/cors v1.11.1 // indirect
 | 
				
			||||||
	github.com/tklauser/go-sysconf v0.3.12 // indirect
 | 
						github.com/tklauser/go-sysconf v0.3.12 // indirect
 | 
				
			||||||
| 
						 | 
					@ -108,20 +101,27 @@ require (
 | 
				
			||||||
	go.opentelemetry.io/collector/config/configtls v1.24.0 // indirect
 | 
						go.opentelemetry.io/collector/config/configtls v1.24.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/collector/consumer/consumererror v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/consumer/consumererror v0.118.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/collector/extension/auth v0.118.0 // indirect
 | 
						go.opentelemetry.io/collector/extension/auth v0.118.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/contrib/zpages v0.59.0 // indirect
 | 
						go.opentelemetry.io/contrib/zpages v0.59.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect
 | 
						go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/exporters/prometheus v0.56.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect
 | 
				
			||||||
 | 
						go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect
 | 
				
			||||||
	go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
						go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 | 
				
			||||||
	golang.org/x/net v0.34.0 // indirect
 | 
						golang.org/x/net v0.34.0 // indirect
 | 
				
			||||||
	golang.org/x/sys v0.29.0 // indirect
 | 
						golang.org/x/sys v0.29.0 // indirect
 | 
				
			||||||
	golang.org/x/text v0.21.0 // indirect
 | 
						golang.org/x/text v0.21.0 // indirect
 | 
				
			||||||
	google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect
 | 
						google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect
 | 
				
			||||||
	google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
 | 
						google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
 | 
				
			||||||
 | 
						google.golang.org/grpc v1.69.4 // indirect
 | 
				
			||||||
	google.golang.org/protobuf v1.36.3 // indirect
 | 
						google.golang.org/protobuf v1.36.3 // indirect
 | 
				
			||||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
						gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,10 +105,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
 | 
				
			||||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
					go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw=
 | 
				
			||||||
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
					go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c=
 | 
					go.opentelemetry.io/contrib/config v0.14.0 h1:QAG8uHNp5ZiCkpT7XggSmg5AyW1sA0LgypMoXgBB1+4=
 | 
				
			||||||
go.opentelemetry.io/contrib/config v0.10.0/go.mod h1:aND2M6/KfNkntI5cyvHriR/zvZgPf8j9yETdSmvpfmc=
 | 
					go.opentelemetry.io/contrib/config v0.14.0/go.mod h1:77rDmFPqBae5jtQ2C78RuDTHz4P27C8LzoN0MZyumYQ=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE=
 | 
					 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4=
 | 
					 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s=
 | 
				
			||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
 | 
					go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
 | 
				
			||||||
go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8=
 | 
					go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8=
 | 
				
			||||||
| 
						 | 
					@ -117,34 +115,36 @@ go.opentelemetry.io/contrib/zpages v0.59.0 h1:t0H5zUy8fifIhRuVwm2FrA/D70Kk10SSpA
 | 
				
			||||||
go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
					go.opentelemetry.io/contrib/zpages v0.59.0/go.mod h1:9wo+yUPvHnBQEzoHJ8R3nA/Q5rkef7HjtLlSFI0Tgrc=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
					go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 | 
				
			||||||
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
					go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0 h1:mMOmtYie9Fx6TSVzw4W+NTpvoaS1JWWga37oI1a/4qQ=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.7.0/go.mod h1:yy7nDsMMBUkD+jeekJ36ur5f3jJIrmCwUrY67VFhNpA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0=
 | 
				
			||||||
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0 h1:lUsI2TYsQw2r1IASwoROaCnjdj2cvC2+Jbxvk6nHnWU=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.31.0/go.mod h1:2HpZxxQurfGxJlJDblybejHB6RX6pmExPNe517hREw4=
 | 
					go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
					go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80=
 | 
				
			||||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64=
 | 
					go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
					go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0=
 | 
				
			||||||
go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
					go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
					go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
 | 
				
			||||||
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
					go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
					go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM=
 | 
					go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
 | 
				
			||||||
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
					go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 | 
				
			||||||
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
					go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ import (
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/internal/testutil"
 | 
						"go.opentelemetry.io/collector/internal/testutil"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,9 @@ func GetAvailableLocalAddressPrometheus(tb testing.TB) *config.Prometheus {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func addrToPrometheus(address string) *config.Prometheus {
 | 
					func addrToPrometheus(address string) *config.Prometheus {
 | 
				
			||||||
	host, port, err := net.SplitHostPort(address)
 | 
						host, port, err := net.SplitHostPort(address)
 | 
				
			||||||
 | 
						if host == "::1" {
 | 
				
			||||||
 | 
							host = "[::1]"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -31,7 +34,17 @@ func addrToPrometheus(address string) *config.Prometheus {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &config.Prometheus{
 | 
						return &config.Prometheus{
 | 
				
			||||||
		Host: &host,
 | 
							Host:              &host,
 | 
				
			||||||
		Port: &portInt,
 | 
							Port:              &portInt,
 | 
				
			||||||
 | 
							WithoutScopeInfo:  ptr(true),
 | 
				
			||||||
 | 
							WithoutUnits:      ptr(true),
 | 
				
			||||||
 | 
							WithoutTypeSuffix: ptr(true),
 | 
				
			||||||
 | 
							WithResourceConstantLabels: &config.IncludeExclude{
 | 
				
			||||||
 | 
								Included: []string{},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ptr[T any](v T) *T {
 | 
				
			||||||
 | 
						return &v
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,7 @@ import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"runtime"
 | 
						"runtime"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	"go.opentelemetry.io/otel/log"
 | 
						"go.opentelemetry.io/otel/log"
 | 
				
			||||||
	"go.opentelemetry.io/otel/metric"
 | 
						"go.opentelemetry.io/otel/metric"
 | 
				
			||||||
	sdkresource "go.opentelemetry.io/otel/sdk/resource"
 | 
						sdkresource "go.opentelemetry.io/otel/sdk/resource"
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,7 @@ import (
 | 
				
			||||||
	"go.opentelemetry.io/collector/pdata/pcommon"
 | 
						"go.opentelemetry.io/collector/pdata/pcommon"
 | 
				
			||||||
	"go.opentelemetry.io/collector/processor"
 | 
						"go.opentelemetry.io/collector/processor"
 | 
				
			||||||
	"go.opentelemetry.io/collector/receiver"
 | 
						"go.opentelemetry.io/collector/receiver"
 | 
				
			||||||
 | 
						semconv118 "go.opentelemetry.io/collector/semconv/v1.18.0"
 | 
				
			||||||
	semconv "go.opentelemetry.io/collector/semconv/v1.26.0"
 | 
						semconv "go.opentelemetry.io/collector/semconv/v1.26.0"
 | 
				
			||||||
	"go.opentelemetry.io/collector/service/extensions"
 | 
						"go.opentelemetry.io/collector/service/extensions"
 | 
				
			||||||
	"go.opentelemetry.io/collector/service/internal/builders"
 | 
						"go.opentelemetry.io/collector/service/internal/builders"
 | 
				
			||||||
| 
						 | 
					@ -47,6 +48,14 @@ var _ = featuregate.GlobalRegistry().MustRegister(
 | 
				
			||||||
	featuregate.WithRegisterDescription("controls whether the collector supports extended OpenTelemetry"+
 | 
						featuregate.WithRegisterDescription("controls whether the collector supports extended OpenTelemetry"+
 | 
				
			||||||
		"configuration for internal telemetry"))
 | 
							"configuration for internal telemetry"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// disableHighCardinalityMetricsFeatureGate is the feature gate that controls whether the collector should enable
 | 
				
			||||||
 | 
					// potentially high cardinality metrics. The gate will be removed when the collector allows for view configuration.
 | 
				
			||||||
 | 
					var disableHighCardinalityMetricsFeatureGate = featuregate.GlobalRegistry().MustRegister(
 | 
				
			||||||
 | 
						"telemetry.disableHighCardinalityMetrics",
 | 
				
			||||||
 | 
						featuregate.StageAlpha,
 | 
				
			||||||
 | 
						featuregate.WithRegisterDescription("controls whether the collector should enable potentially high"+
 | 
				
			||||||
 | 
							"cardinality metrics. The gate will be removed when the collector allows for view configuration."))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Settings holds configuration for building a new Service.
 | 
					// Settings holds configuration for building a new Service.
 | 
				
			||||||
type Settings struct {
 | 
					type Settings struct {
 | 
				
			||||||
	// BuildInfo provides collector start information.
 | 
						// BuildInfo provides collector start information.
 | 
				
			||||||
| 
						 | 
					@ -120,9 +129,12 @@ func New(ctx context.Context, set Settings, cfg Config) (*Service, error) {
 | 
				
			||||||
	pcommonRes := pdataFromSdk(res)
 | 
						pcommonRes := pdataFromSdk(res)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sch := semconv.SchemaURL
 | 
						sch := semconv.SchemaURL
 | 
				
			||||||
	cfgRes := config.Resource{
 | 
					
 | 
				
			||||||
		SchemaUrl:  &sch,
 | 
						views := configureViews(cfg.Telemetry.Metrics.Level)
 | 
				
			||||||
		Attributes: attributes(res, cfg.Telemetry),
 | 
					
 | 
				
			||||||
 | 
						readers := cfg.Telemetry.Metrics.Readers
 | 
				
			||||||
 | 
						if cfg.Telemetry.Metrics.Level == configtelemetry.LevelNone {
 | 
				
			||||||
 | 
							readers = []config.MetricReader{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sdk, err := config.NewSDK(
 | 
						sdk, err := config.NewSDK(
 | 
				
			||||||
| 
						 | 
					@ -132,10 +144,17 @@ func New(ctx context.Context, set Settings, cfg Config) (*Service, error) {
 | 
				
			||||||
				LoggerProvider: &config.LoggerProvider{
 | 
									LoggerProvider: &config.LoggerProvider{
 | 
				
			||||||
					Processors: cfg.Telemetry.Logs.Processors,
 | 
										Processors: cfg.Telemetry.Logs.Processors,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
 | 
									MeterProvider: &config.MeterProvider{
 | 
				
			||||||
 | 
										Readers: readers,
 | 
				
			||||||
 | 
										Views:   views,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
				TracerProvider: &config.TracerProvider{
 | 
									TracerProvider: &config.TracerProvider{
 | 
				
			||||||
					Processors: cfg.Telemetry.Traces.Processors,
 | 
										Processors: cfg.Telemetry.Traces.Processors,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				Resource: &cfgRes,
 | 
									Resource: &config.Resource{
 | 
				
			||||||
 | 
										SchemaUrl:  &sch,
 | 
				
			||||||
 | 
										Attributes: attributes(res, cfg.Telemetry),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		),
 | 
							),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
| 
						 | 
					@ -152,12 +171,14 @@ func New(ctx context.Context, set Settings, cfg Config) (*Service, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	logger, lp, err := telFactory.CreateLogger(ctx, telset, &cfg.Telemetry)
 | 
						logger, lp, err := telFactory.CreateLogger(ctx, telset, &cfg.Telemetry)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = multierr.Append(err, sdk.Shutdown(ctx))
 | 
				
			||||||
		return nil, fmt.Errorf("failed to create logger: %w", err)
 | 
							return nil, fmt.Errorf("failed to create logger: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	srv.loggerProvider = lp
 | 
						srv.loggerProvider = lp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tracerProvider, err := telFactory.CreateTracerProvider(ctx, telset, &cfg.Telemetry)
 | 
						tracerProvider, err := telFactory.CreateTracerProvider(ctx, telset, &cfg.Telemetry)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = multierr.Append(err, sdk.Shutdown(ctx))
 | 
				
			||||||
		return nil, fmt.Errorf("failed to create tracer provider: %w", err)
 | 
							return nil, fmt.Errorf("failed to create tracer provider: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,6 +186,7 @@ func New(ctx context.Context, set Settings, cfg Config) (*Service, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mp, err := telFactory.CreateMeterProvider(ctx, telset, &cfg.Telemetry)
 | 
						mp, err := telFactory.CreateMeterProvider(ctx, telset, &cfg.Telemetry)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = multierr.Append(err, sdk.Shutdown(ctx))
 | 
				
			||||||
		return nil, fmt.Errorf("failed to create meter provider: %w", err)
 | 
							return nil, fmt.Errorf("failed to create meter provider: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -208,8 +230,7 @@ func logsAboutMeterProvider(logger *zap.Logger, cfg telemetry.MetricsConfig, mp
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//nolint:staticcheck
 | 
						if len(cfg.Address) != 0 { // SA1019
 | 
				
			||||||
	if len(cfg.Address) != 0 {
 | 
					 | 
				
			||||||
		logger.Warn("service::telemetry::metrics::address is being deprecated in favor of service::telemetry::metrics::readers")
 | 
							logger.Warn("service::telemetry::metrics::address is being deprecated in favor of service::telemetry::metrics::readers")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -362,3 +383,136 @@ func pdataFromSdk(res *sdkresource.Resource) pcommon.Resource {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return pcommonRes
 | 
						return pcommonRes
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func dropViewOption(selector *config.ViewSelector) config.View {
 | 
				
			||||||
 | 
						return config.View{
 | 
				
			||||||
 | 
							Selector: selector,
 | 
				
			||||||
 | 
							Stream: &config.ViewStream{
 | 
				
			||||||
 | 
								Aggregation: &config.ViewStreamAggregation{
 | 
				
			||||||
 | 
									Drop: config.ViewStreamAggregationDrop{},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func configureViews(level configtelemetry.Level) []config.View {
 | 
				
			||||||
 | 
						views := []config.View{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if disableHighCardinalityMetricsFeatureGate.IsEnabled() {
 | 
				
			||||||
 | 
							views = append(views, []config.View{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Selector: &config.ViewSelector{
 | 
				
			||||||
 | 
										MeterName: ptr("go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Stream: &config.ViewStream{
 | 
				
			||||||
 | 
										AttributeKeys: &config.IncludeExclude{
 | 
				
			||||||
 | 
											Excluded: []string{
 | 
				
			||||||
 | 
												semconv118.AttributeNetSockPeerAddr,
 | 
				
			||||||
 | 
												semconv118.AttributeNetSockPeerPort,
 | 
				
			||||||
 | 
												semconv118.AttributeNetSockPeerName,
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Selector: &config.ViewSelector{
 | 
				
			||||||
 | 
										MeterName: ptr("go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"),
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									Stream: &config.ViewStream{
 | 
				
			||||||
 | 
										AttributeKeys: &config.IncludeExclude{
 | 
				
			||||||
 | 
											Excluded: []string{
 | 
				
			||||||
 | 
												semconv118.AttributeNetHostName,
 | 
				
			||||||
 | 
												semconv118.AttributeNetHostPort,
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							}...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if level < configtelemetry.LevelDetailed {
 | 
				
			||||||
 | 
							// Drop all otelhttp and otelgrpc metrics if the level is not detailed.
 | 
				
			||||||
 | 
							views = append(views,
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName: ptr("go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName: ptr("go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// otel-arrow library metrics
 | 
				
			||||||
 | 
						// See https://github.com/open-telemetry/otel-arrow/blob/c39257/pkg/otel/arrow_record/consumer.go#L174-L176
 | 
				
			||||||
 | 
						if level < configtelemetry.LevelNormal {
 | 
				
			||||||
 | 
							scope := ptr("otel-arrow/pkg/otel/arrow_record")
 | 
				
			||||||
 | 
							views = append(views,
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("arrow_batch_records"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("arrow_schema_resets"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("arrow_memory_inuse"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// contrib's internal/otelarrow/netstats metrics
 | 
				
			||||||
 | 
						// See
 | 
				
			||||||
 | 
						// - https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a25f05/internal/otelarrow/netstats/netstats.go#L130
 | 
				
			||||||
 | 
						// - https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a25f05/internal/otelarrow/netstats/netstats.go#L165
 | 
				
			||||||
 | 
						if level < configtelemetry.LevelDetailed {
 | 
				
			||||||
 | 
							scope := ptr("github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							views = append(views,
 | 
				
			||||||
 | 
								// Compressed size metrics.
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("otelcol_*_compressed_size"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("otelcol_*_compressed_size"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// makeRecvMetrics for exporters.
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("otelcol_exporter_recv"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("otelcol_exporter_recv_wire"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// makeSentMetrics for receivers.
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("otelcol_receiver_sent"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
								dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
									MeterName:      scope,
 | 
				
			||||||
 | 
									InstrumentName: ptr("otelcol_receiver_sent_wire"),
 | 
				
			||||||
 | 
								}),
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Batch processor metrics
 | 
				
			||||||
 | 
						if level < configtelemetry.LevelDetailed {
 | 
				
			||||||
 | 
							scope := ptr("go.opentelemetry.io/collector/processor/batchprocessor")
 | 
				
			||||||
 | 
							views = append(views, dropViewOption(&config.ViewSelector{
 | 
				
			||||||
 | 
								MeterName:      scope,
 | 
				
			||||||
 | 
								InstrumentName: ptr("otelcol_processor_batch_batch_send_size_bytes"),
 | 
				
			||||||
 | 
							}))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return views
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ptr[T any](v T) *T {
 | 
				
			||||||
 | 
						return &v
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ import (
 | 
				
			||||||
	"github.com/prometheus/common/expfmt"
 | 
						"github.com/prometheus/common/expfmt"
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	"go.uber.org/zap"
 | 
						"go.uber.org/zap"
 | 
				
			||||||
	"go.uber.org/zap/zapcore"
 | 
						"go.uber.org/zap/zapcore"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -318,7 +318,7 @@ func testCollectorStartHelperWithReaders(t *testing.T, tc ownMetricsTestCase, ne
 | 
				
			||||||
	cfg.Telemetry.Metrics.Readers = []config.MetricReader{
 | 
						cfg.Telemetry.Metrics.Readers = []config.MetricReader{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Pull: &config.PullMetricReader{
 | 
								Pull: &config.PullMetricReader{
 | 
				
			||||||
				Exporter: config.MetricExporter{
 | 
									Exporter: config.PullMetricExporter{
 | 
				
			||||||
					Prometheus: metricsAddr,
 | 
										Prometheus: metricsAddr,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
| 
						 | 
					@ -497,7 +497,7 @@ func TestServiceInvalidTelemetryConfiguration(t *testing.T) {
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			wantErr: errors.New("unsupported protocol \"\""),
 | 
								wantErr: errors.New("no valid log exporter"),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, tt := range tests {
 | 
						for _, tt := range tests {
 | 
				
			||||||
| 
						 | 
					@ -556,12 +556,16 @@ func assertMetrics(t *testing.T, metricsAddr string, expectedLabels map[string]l
 | 
				
			||||||
		"otelcol_process_runtime_heap_alloc_bytes":       false,
 | 
							"otelcol_process_runtime_heap_alloc_bytes":       false,
 | 
				
			||||||
		"otelcol_process_runtime_total_alloc_bytes":      false,
 | 
							"otelcol_process_runtime_total_alloc_bytes":      false,
 | 
				
			||||||
		"otelcol_process_uptime":                         false,
 | 
							"otelcol_process_uptime":                         false,
 | 
				
			||||||
 | 
							"promhttp_metric_handler_errors_total":           false,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for metricName, metricFamily := range parsed {
 | 
						for metricName, metricFamily := range parsed {
 | 
				
			||||||
		if _, ok := expectedMetrics[metricName]; !ok {
 | 
							if _, ok := expectedMetrics[metricName]; !ok {
 | 
				
			||||||
			require.True(t, ok, "unexpected metric: %s", metricName)
 | 
								require.True(t, ok, "unexpected metric: %s", metricName)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		expectedMetrics[metricName] = true
 | 
							expectedMetrics[metricName] = true
 | 
				
			||||||
 | 
							if metricName == "promhttp_metric_handler_errors_total" {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if metricName != "target_info" {
 | 
							if metricName != "target_info" {
 | 
				
			||||||
			// require is used here so test fails with a single message.
 | 
								// require is used here so test fails with a single message.
 | 
				
			||||||
			require.True(
 | 
								require.True(
 | 
				
			||||||
| 
						 | 
					@ -691,7 +695,7 @@ func newNopConfigPipelineConfigs(pipelineCfgs pipelines.Config) Config {
 | 
				
			||||||
				Level: configtelemetry.LevelBasic,
 | 
									Level: configtelemetry.LevelBasic,
 | 
				
			||||||
				Readers: []config.MetricReader{
 | 
									Readers: []config.MetricReader{
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
 | 
											Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{Prometheus: &config.Prometheus{
 | 
				
			||||||
							Host: newPtr("localhost"),
 | 
												Host: newPtr("localhost"),
 | 
				
			||||||
							Port: newPtr(8888),
 | 
												Port: newPtr(8888),
 | 
				
			||||||
						}}},
 | 
											}}},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,14 +8,13 @@ import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	"go.uber.org/zap/zapcore"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/config/configtelemetry"
 | 
						"go.opentelemetry.io/collector/config/configtelemetry"
 | 
				
			||||||
	"go.opentelemetry.io/collector/confmap"
 | 
						"go.opentelemetry.io/collector/confmap"
 | 
				
			||||||
	"go.opentelemetry.io/collector/featuregate"
 | 
						"go.opentelemetry.io/collector/featuregate"
 | 
				
			||||||
 | 
						"go.opentelemetry.io/collector/service/telemetry/internal/migration"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ confmap.Unmarshaler = (*Config)(nil)
 | 
					var _ confmap.Unmarshaler = (*Config)(nil)
 | 
				
			||||||
| 
						 | 
					@ -43,123 +42,20 @@ type Config struct {
 | 
				
			||||||
// LogsConfig defines the configurable settings for service telemetry logs.
 | 
					// LogsConfig defines the configurable settings for service telemetry logs.
 | 
				
			||||||
// This MUST be compatible with zap.Config. Cannot use directly zap.Config because
 | 
					// This MUST be compatible with zap.Config. Cannot use directly zap.Config because
 | 
				
			||||||
// the collector uses mapstructure and not yaml tags.
 | 
					// the collector uses mapstructure and not yaml tags.
 | 
				
			||||||
type LogsConfig struct {
 | 
					type LogsConfig = migration.LogsConfigV030
 | 
				
			||||||
	// Level is the minimum enabled logging level.
 | 
					 | 
				
			||||||
	// (default = "INFO")
 | 
					 | 
				
			||||||
	Level zapcore.Level `mapstructure:"level"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Development puts the logger in development mode, which changes the
 | 
					 | 
				
			||||||
	// behavior of DPanicLevel and takes stacktraces more liberally.
 | 
					 | 
				
			||||||
	// (default = false)
 | 
					 | 
				
			||||||
	Development bool `mapstructure:"development"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Encoding sets the logger's encoding.
 | 
					 | 
				
			||||||
	// Example values are "json", "console".
 | 
					 | 
				
			||||||
	Encoding string `mapstructure:"encoding"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// DisableCaller stops annotating logs with the calling function's file
 | 
					 | 
				
			||||||
	// name and line number. By default, all logs are annotated.
 | 
					 | 
				
			||||||
	// (default = false)
 | 
					 | 
				
			||||||
	DisableCaller bool `mapstructure:"disable_caller"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// DisableStacktrace completely disables automatic stacktrace capturing. By
 | 
					 | 
				
			||||||
	// default, stacktraces are captured for WarnLevel and above logs in
 | 
					 | 
				
			||||||
	// development and ErrorLevel and above in production.
 | 
					 | 
				
			||||||
	// (default = false)
 | 
					 | 
				
			||||||
	DisableStacktrace bool `mapstructure:"disable_stacktrace"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Sampling sets a sampling policy.
 | 
					 | 
				
			||||||
	// Default:
 | 
					 | 
				
			||||||
	// 		sampling:
 | 
					 | 
				
			||||||
	//	   		enabled: true
 | 
					 | 
				
			||||||
	//	   		tick: 10s
 | 
					 | 
				
			||||||
	//	   		initial: 10
 | 
					 | 
				
			||||||
	//	   		thereafter: 100
 | 
					 | 
				
			||||||
	// Sampling can be disabled by setting 'enabled' to false
 | 
					 | 
				
			||||||
	Sampling *LogsSamplingConfig `mapstructure:"sampling"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// OutputPaths is a list of URLs or file paths to write logging output to.
 | 
					 | 
				
			||||||
	// The URLs could only be with "file" schema or without schema.
 | 
					 | 
				
			||||||
	// The URLs with "file" schema must be an absolute path.
 | 
					 | 
				
			||||||
	// The URLs without schema are treated as local file paths.
 | 
					 | 
				
			||||||
	// "stdout" and "stderr" are interpreted as os.Stdout and os.Stderr.
 | 
					 | 
				
			||||||
	// see details at Open in zap/writer.go.
 | 
					 | 
				
			||||||
	// (default = ["stderr"])
 | 
					 | 
				
			||||||
	OutputPaths []string `mapstructure:"output_paths"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// ErrorOutputPaths is a list of URLs or file paths to write zap internal logger errors to.
 | 
					 | 
				
			||||||
	// The URLs could only be with "file" schema or without schema.
 | 
					 | 
				
			||||||
	// The URLs with "file" schema must use absolute paths.
 | 
					 | 
				
			||||||
	// The URLs without schema are treated as local file paths.
 | 
					 | 
				
			||||||
	// "stdout" and "stderr" are interpreted as os.Stdout and os.Stderr.
 | 
					 | 
				
			||||||
	// see details at Open in zap/writer.go.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// Note that this setting only affects the zap internal logger errors.
 | 
					 | 
				
			||||||
	// (default = ["stderr"])
 | 
					 | 
				
			||||||
	ErrorOutputPaths []string `mapstructure:"error_output_paths"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// InitialFields is a collection of fields to add to the root logger.
 | 
					 | 
				
			||||||
	// Example:
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// 		initial_fields:
 | 
					 | 
				
			||||||
	//	   		foo: "bar"
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// By default, there is no initial field.
 | 
					 | 
				
			||||||
	InitialFields map[string]any `mapstructure:"initial_fields"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Processors allow configuration of log record processors to emit logs to
 | 
					 | 
				
			||||||
	// any number of suported backends.
 | 
					 | 
				
			||||||
	Processors []config.LogRecordProcessor `mapstructure:"processors"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LogsSamplingConfig sets a sampling strategy for the logger. Sampling caps the
 | 
					// LogsSamplingConfig sets a sampling strategy for the logger. Sampling caps the
 | 
				
			||||||
// global CPU and I/O load that logging puts on your process while attempting
 | 
					// global CPU and I/O load that logging puts on your process while attempting
 | 
				
			||||||
// to preserve a representative subset of your logs.
 | 
					// to preserve a representative subset of your logs.
 | 
				
			||||||
type LogsSamplingConfig struct {
 | 
					type LogsSamplingConfig = migration.LogsSamplingConfig
 | 
				
			||||||
	// Enabled enable sampling logging
 | 
					 | 
				
			||||||
	Enabled bool `mapstructure:"enabled"`
 | 
					 | 
				
			||||||
	// Tick represents the interval in seconds that the logger apply each sampling.
 | 
					 | 
				
			||||||
	Tick time.Duration `mapstructure:"tick"`
 | 
					 | 
				
			||||||
	// Initial represents the first M messages logged each Tick.
 | 
					 | 
				
			||||||
	Initial int `mapstructure:"initial"`
 | 
					 | 
				
			||||||
	// Thereafter represents the sampling rate, every Nth message will be sampled after Initial messages are logged during each Tick.
 | 
					 | 
				
			||||||
	// If Thereafter is zero, the logger will drop all the messages after the Initial each Tick.
 | 
					 | 
				
			||||||
	Thereafter int `mapstructure:"thereafter"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MetricsConfig exposes the common Telemetry configuration for one component.
 | 
					// MetricsConfig exposes the common Telemetry configuration for one component.
 | 
				
			||||||
// Experimental: *NOTE* this structure is subject to change or removal in the future.
 | 
					// Experimental: *NOTE* this structure is subject to change or removal in the future.
 | 
				
			||||||
type MetricsConfig struct {
 | 
					type MetricsConfig = migration.MetricsConfigV030
 | 
				
			||||||
	// Level is the level of telemetry metrics, the possible values are:
 | 
					 | 
				
			||||||
	//  - "none" indicates that no telemetry data should be collected;
 | 
					 | 
				
			||||||
	//  - "basic" is the recommended and covers the basics of the service telemetry.
 | 
					 | 
				
			||||||
	//  - "normal" adds some other indicators on top of basic.
 | 
					 | 
				
			||||||
	//  - "detailed" adds dimensions and views to the previous levels.
 | 
					 | 
				
			||||||
	Level configtelemetry.Level `mapstructure:"level"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Deprecated: [v0.111.0] use readers configuration.
 | 
					 | 
				
			||||||
	Address string `mapstructure:"address"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Readers allow configuration of metric readers to emit metrics to
 | 
					 | 
				
			||||||
	// any number of supported backends.
 | 
					 | 
				
			||||||
	Readers []config.MetricReader `mapstructure:"readers"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TracesConfig exposes the common Telemetry configuration for collector's internal spans.
 | 
					// TracesConfig exposes the common Telemetry configuration for collector's internal spans.
 | 
				
			||||||
// Experimental: *NOTE* this structure is subject to change or removal in the future.
 | 
					// Experimental: *NOTE* this structure is subject to change or removal in the future.
 | 
				
			||||||
type TracesConfig struct {
 | 
					type TracesConfig = migration.TracesConfigV030
 | 
				
			||||||
	// Level configures whether spans are emitted or not, the possible values are:
 | 
					 | 
				
			||||||
	//  - "none" indicates that no tracing data should be collected;
 | 
					 | 
				
			||||||
	//  - "basic" is the recommended and covers the basics of the service telemetry.
 | 
					 | 
				
			||||||
	Level configtelemetry.Level `mapstructure:"level"`
 | 
					 | 
				
			||||||
	// Propagators is a list of TextMapPropagators from the supported propagators list. Currently,
 | 
					 | 
				
			||||||
	// tracecontext and  b3 are supported. By default, the value is set to empty list and
 | 
					 | 
				
			||||||
	// context propagation is disabled.
 | 
					 | 
				
			||||||
	Propagators []string `mapstructure:"propagators"`
 | 
					 | 
				
			||||||
	// Processors allow configuration of span processors to emit spans to
 | 
					 | 
				
			||||||
	// any number of supported backends.
 | 
					 | 
				
			||||||
	Processors []config.SpanProcessor `mapstructure:"processors"`
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Config) Unmarshal(conf *confmap.Conf) error {
 | 
					func (c *Config) Unmarshal(conf *confmap.Conf) error {
 | 
				
			||||||
	if err := conf.Unmarshal(c); err != nil {
 | 
						if err := conf.Unmarshal(c); err != nil {
 | 
				
			||||||
| 
						 | 
					@ -172,14 +68,14 @@ func (c *Config) Unmarshal(conf *confmap.Conf) error {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(c.Metrics.Address) != 0 {
 | 
						if len(c.Metrics.Address) != 0 { //nolint:staticcheck // SA1019
 | 
				
			||||||
		host, port, err := net.SplitHostPort(c.Metrics.Address)
 | 
							host, port, err := net.SplitHostPort(c.Metrics.Address) //nolint:staticcheck // SA1019
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return fmt.Errorf("failing to parse metrics address %q: %w", c.Metrics.Address, err)
 | 
								return fmt.Errorf("failing to parse metrics address %q: %w", c.Metrics.Address, err) //nolint:staticcheck // SA1019
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		portInt, err := strconv.Atoi(port)
 | 
							portInt, err := strconv.Atoi(port)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return fmt.Errorf("failing to extract the port from the metrics address %q: %w", c.Metrics.Address, err)
 | 
								return fmt.Errorf("failing to extract the port from the metrics address %q: %w", c.Metrics.Address, err) //nolint:staticcheck // SA1019
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// User did not overwrite readers, so we will remove the default configured reader.
 | 
							// User did not overwrite readers, so we will remove the default configured reader.
 | 
				
			||||||
| 
						 | 
					@ -189,10 +85,16 @@ func (c *Config) Unmarshal(conf *confmap.Conf) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		c.Metrics.Readers = append(c.Metrics.Readers, config.MetricReader{
 | 
							c.Metrics.Readers = append(c.Metrics.Readers, config.MetricReader{
 | 
				
			||||||
			Pull: &config.PullMetricReader{
 | 
								Pull: &config.PullMetricReader{
 | 
				
			||||||
				Exporter: config.MetricExporter{
 | 
									Exporter: config.PullMetricExporter{
 | 
				
			||||||
					Prometheus: &config.Prometheus{
 | 
										Prometheus: &config.Prometheus{
 | 
				
			||||||
						Host: &host,
 | 
											Host:              &host,
 | 
				
			||||||
						Port: &portInt,
 | 
											Port:              &portInt,
 | 
				
			||||||
 | 
											WithoutScopeInfo:  newPtr(true),
 | 
				
			||||||
 | 
											WithoutUnits:      newPtr(true),
 | 
				
			||||||
 | 
											WithoutTypeSuffix: newPtr(true),
 | 
				
			||||||
 | 
											WithResourceConstantLabels: &config.IncludeExclude{
 | 
				
			||||||
 | 
												Included: []string{},
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/component/componenttest"
 | 
						"go.opentelemetry.io/collector/component/componenttest"
 | 
				
			||||||
	"go.opentelemetry.io/collector/config/configtelemetry"
 | 
						"go.opentelemetry.io/collector/config/configtelemetry"
 | 
				
			||||||
| 
						 | 
					@ -119,7 +119,7 @@ func TestConfigValidate(t *testing.T) {
 | 
				
			||||||
					Level: configtelemetry.LevelBasic,
 | 
										Level: configtelemetry.LevelBasic,
 | 
				
			||||||
					Readers: []config.MetricReader{
 | 
										Readers: []config.MetricReader{
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
 | 
												Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{Prometheus: &config.Prometheus{
 | 
				
			||||||
								Host: newPtr("127.0.0.1"),
 | 
													Host: newPtr("127.0.0.1"),
 | 
				
			||||||
								Port: newPtr(3333),
 | 
													Port: newPtr(3333),
 | 
				
			||||||
							}}},
 | 
												}}},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	"go.opentelemetry.io/otel/log"
 | 
						"go.opentelemetry.io/otel/log"
 | 
				
			||||||
	"go.opentelemetry.io/otel/metric"
 | 
						"go.opentelemetry.io/otel/metric"
 | 
				
			||||||
	"go.opentelemetry.io/otel/trace"
 | 
						"go.opentelemetry.io/otel/trace"
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,6 @@ import (
 | 
				
			||||||
	"go.opentelemetry.io/collector/component"
 | 
						"go.opentelemetry.io/collector/component"
 | 
				
			||||||
	"go.opentelemetry.io/collector/config/configtelemetry"
 | 
						"go.opentelemetry.io/collector/config/configtelemetry"
 | 
				
			||||||
	"go.opentelemetry.io/collector/featuregate"
 | 
						"go.opentelemetry.io/collector/featuregate"
 | 
				
			||||||
	"go.opentelemetry.io/collector/service/internal/resource"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var useLocalHostAsDefaultMetricsAddressFeatureGate = featuregate.GlobalRegistry().MustRegister(
 | 
					var useLocalHostAsDefaultMetricsAddressFeatureGate = featuregate.GlobalRegistry().MustRegister(
 | 
				
			||||||
| 
						 | 
					@ -27,14 +26,6 @@ var useLocalHostAsDefaultMetricsAddressFeatureGate = featuregate.GlobalRegistry(
 | 
				
			||||||
	featuregate.WithRegisterDescription("controls whether default Prometheus metrics server use localhost as the default host for their endpoints"),
 | 
						featuregate.WithRegisterDescription("controls whether default Prometheus metrics server use localhost as the default host for their endpoints"),
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// disableHighCardinalityMetricsFeatureGate is the feature gate that controls whether the collector should enable
 | 
					 | 
				
			||||||
// potentially high cardinality metrics. The gate will be removed when the collector allows for view configuration.
 | 
					 | 
				
			||||||
var disableHighCardinalityMetricsFeatureGate = featuregate.GlobalRegistry().MustRegister(
 | 
					 | 
				
			||||||
	"telemetry.disableHighCardinalityMetrics",
 | 
					 | 
				
			||||||
	featuregate.StageAlpha,
 | 
					 | 
				
			||||||
	featuregate.WithRegisterDescription("controls whether the collector should enable potentially high"+
 | 
					 | 
				
			||||||
		"cardinality metrics. The gate will be removed when the collector allows for view configuration."))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Settings holds configuration for building Telemetry.
 | 
					// Settings holds configuration for building Telemetry.
 | 
				
			||||||
type Settings struct {
 | 
					type Settings struct {
 | 
				
			||||||
	BuildInfo         component.BuildInfo
 | 
						BuildInfo         component.BuildInfo
 | 
				
			||||||
| 
						 | 
					@ -77,15 +68,7 @@ func NewFactory() Factory {
 | 
				
			||||||
		}),
 | 
							}),
 | 
				
			||||||
		withMeterProvider(func(_ context.Context, set Settings, cfg component.Config) (metric.MeterProvider, error) {
 | 
							withMeterProvider(func(_ context.Context, set Settings, cfg component.Config) (metric.MeterProvider, error) {
 | 
				
			||||||
			c := *cfg.(*Config)
 | 
								c := *cfg.(*Config)
 | 
				
			||||||
			disableHighCard := disableHighCardinalityMetricsFeatureGate.IsEnabled()
 | 
								return newMeterProvider(set, c)
 | 
				
			||||||
			return newMeterProvider(
 | 
					 | 
				
			||||||
				meterProviderSettings{
 | 
					 | 
				
			||||||
					res:               resource.New(set.BuildInfo, c.Resource),
 | 
					 | 
				
			||||||
					cfg:               c.Metrics,
 | 
					 | 
				
			||||||
					asyncErrorChannel: set.AsyncErrorChannel,
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
				disableHighCard,
 | 
					 | 
				
			||||||
			)
 | 
					 | 
				
			||||||
		}),
 | 
							}),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -117,9 +100,15 @@ func createDefaultConfig() component.Config {
 | 
				
			||||||
			Level: configtelemetry.LevelNormal,
 | 
								Level: configtelemetry.LevelNormal,
 | 
				
			||||||
			Readers: []config.MetricReader{
 | 
								Readers: []config.MetricReader{
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
 | 
										Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{Prometheus: &config.Prometheus{
 | 
				
			||||||
						Host: &metricsHost,
 | 
											WithoutScopeInfo:  newPtr(true),
 | 
				
			||||||
						Port: newPtr(8888),
 | 
											WithoutUnits:      newPtr(true),
 | 
				
			||||||
 | 
											WithoutTypeSuffix: newPtr(true),
 | 
				
			||||||
 | 
											Host:              &metricsHost,
 | 
				
			||||||
 | 
											Port:              newPtr(8888),
 | 
				
			||||||
 | 
											WithResourceConstantLabels: &config.IncludeExclude{
 | 
				
			||||||
 | 
												Included: []string{},
 | 
				
			||||||
 | 
											},
 | 
				
			||||||
					}}},
 | 
										}}},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
| 
						 | 
					@ -127,6 +116,6 @@ func createDefaultConfig() component.Config {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newPtr[T int | string](str T) *T {
 | 
					func newPtr[T int | string | bool](str T) *T {
 | 
				
			||||||
	return &str
 | 
						return &str
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,7 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	"go.uber.org/zap"
 | 
						"go.uber.org/zap"
 | 
				
			||||||
	"go.uber.org/zap/zapcore"
 | 
						"go.uber.org/zap/zapcore"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,7 +67,7 @@ func TestTelemetryConfiguration(t *testing.T) {
 | 
				
			||||||
					Level: configtelemetry.LevelBasic,
 | 
										Level: configtelemetry.LevelBasic,
 | 
				
			||||||
					Readers: []config.MetricReader{
 | 
										Readers: []config.MetricReader{
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
 | 
												Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{Prometheus: &config.Prometheus{
 | 
				
			||||||
								Host: newPtr("127.0.0.1"),
 | 
													Host: newPtr("127.0.0.1"),
 | 
				
			||||||
								Port: newPtr(3333),
 | 
													Port: newPtr(3333),
 | 
				
			||||||
							}}},
 | 
												}}},
 | 
				
			||||||
| 
						 | 
					@ -87,7 +87,7 @@ func TestTelemetryConfiguration(t *testing.T) {
 | 
				
			||||||
					Level: configtelemetry.LevelBasic,
 | 
										Level: configtelemetry.LevelBasic,
 | 
				
			||||||
					Readers: []config.MetricReader{
 | 
										Readers: []config.MetricReader{
 | 
				
			||||||
						{
 | 
											{
 | 
				
			||||||
							Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
 | 
												Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{Prometheus: &config.Prometheus{
 | 
				
			||||||
								Host: newPtr("127.0.0.1"),
 | 
													Host: newPtr("127.0.0.1"),
 | 
				
			||||||
								Port: newPtr(3333),
 | 
													Port: newPtr(3333),
 | 
				
			||||||
							}}},
 | 
												}}},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					level: "info"
 | 
				
			||||||
 | 
					processors:
 | 
				
			||||||
 | 
					  - batch:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        otlp:
 | 
				
			||||||
 | 
					          protocol: http/protobuf
 | 
				
			||||||
 | 
					          endpoint: 127.0.0.1:4317
 | 
				
			||||||
 | 
					          headers:
 | 
				
			||||||
 | 
					            "key1": "value1"
 | 
				
			||||||
 | 
					  - simple:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        console: {}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					level: detailed
 | 
				
			||||||
 | 
					readers:
 | 
				
			||||||
 | 
					  - periodic:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        otlp:
 | 
				
			||||||
 | 
					          protocol: http/protobuf
 | 
				
			||||||
 | 
					          endpoint: 127.0.0.1:4317
 | 
				
			||||||
 | 
					          headers:
 | 
				
			||||||
 | 
					            "key1": "value1"
 | 
				
			||||||
 | 
					  - pull:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        prometheus:
 | 
				
			||||||
 | 
					          host: 127.0.0.1
 | 
				
			||||||
 | 
					          port: 8902
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					level: "none"
 | 
				
			||||||
 | 
					processors:
 | 
				
			||||||
 | 
					  - batch:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        otlp:
 | 
				
			||||||
 | 
					          protocol: http/protobuf
 | 
				
			||||||
 | 
					          endpoint: 127.0.0.1:4317
 | 
				
			||||||
 | 
					          headers:
 | 
				
			||||||
 | 
					            "key1": "value1"
 | 
				
			||||||
 | 
					  - simple:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        console: {}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					level: "info"
 | 
				
			||||||
 | 
					processors:
 | 
				
			||||||
 | 
					  - batch:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        otlp:
 | 
				
			||||||
 | 
					          protocol: http/protobuf
 | 
				
			||||||
 | 
					          endpoint: 127.0.0.1:4317
 | 
				
			||||||
 | 
					          headers:
 | 
				
			||||||
 | 
					          - name: "key1"
 | 
				
			||||||
 | 
					            value: "value1"
 | 
				
			||||||
 | 
					  - simple:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        console: {}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					level: detailed
 | 
				
			||||||
 | 
					readers:
 | 
				
			||||||
 | 
					  - periodic:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        otlp:
 | 
				
			||||||
 | 
					          protocol: http/protobuf
 | 
				
			||||||
 | 
					          endpoint: 127.0.0.1:4317
 | 
				
			||||||
 | 
					          headers:
 | 
				
			||||||
 | 
					          - name: "key1"
 | 
				
			||||||
 | 
					            value: "value1"
 | 
				
			||||||
 | 
					  - pull:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        prometheus:
 | 
				
			||||||
 | 
					          host: 127.0.0.1
 | 
				
			||||||
 | 
					          port: 8902
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					level: "none"
 | 
				
			||||||
 | 
					processors:
 | 
				
			||||||
 | 
					  - batch:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        otlp:
 | 
				
			||||||
 | 
					          protocol: http/protobuf
 | 
				
			||||||
 | 
					          endpoint: 127.0.0.1:4317
 | 
				
			||||||
 | 
					          headers:
 | 
				
			||||||
 | 
					          - name: "key1"
 | 
				
			||||||
 | 
					            value: "value1"
 | 
				
			||||||
 | 
					  - simple:
 | 
				
			||||||
 | 
					      exporter:
 | 
				
			||||||
 | 
					        console: {}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,214 @@
 | 
				
			||||||
 | 
					// Copyright The OpenTelemetry Authors
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package migration // import "go.opentelemetry.io/collector/service/telemetry/internal/migration"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						configv02 "go.opentelemetry.io/contrib/config/v0.2.0"
 | 
				
			||||||
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
 | 
						"go.uber.org/zap/zapcore"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"go.opentelemetry.io/collector/config/configtelemetry"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type tracesConfigV020 struct {
 | 
				
			||||||
 | 
						Level       configtelemetry.Level     `mapstructure:"level"`
 | 
				
			||||||
 | 
						Propagators []string                  `mapstructure:"propagators"`
 | 
				
			||||||
 | 
						Processors  []configv02.SpanProcessor `mapstructure:"processors"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type metricsConfigV020 struct {
 | 
				
			||||||
 | 
						Level   configtelemetry.Level    `mapstructure:"level"`
 | 
				
			||||||
 | 
						Address string                   `mapstructure:"address"`
 | 
				
			||||||
 | 
						Readers []configv02.MetricReader `mapstructure:"readers"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type logsConfigV020 struct {
 | 
				
			||||||
 | 
						Level             zapcore.Level                  `mapstructure:"level"`
 | 
				
			||||||
 | 
						Development       bool                           `mapstructure:"development"`
 | 
				
			||||||
 | 
						Encoding          string                         `mapstructure:"encoding"`
 | 
				
			||||||
 | 
						DisableCaller     bool                           `mapstructure:"disable_caller"`
 | 
				
			||||||
 | 
						DisableStacktrace bool                           `mapstructure:"disable_stacktrace"`
 | 
				
			||||||
 | 
						Sampling          *LogsSamplingConfig            `mapstructure:"sampling"`
 | 
				
			||||||
 | 
						OutputPaths       []string                       `mapstructure:"output_paths"`
 | 
				
			||||||
 | 
						ErrorOutputPaths  []string                       `mapstructure:"error_output_paths"`
 | 
				
			||||||
 | 
						InitialFields     map[string]any                 `mapstructure:"initial_fields"`
 | 
				
			||||||
 | 
						Processors        []configv02.LogRecordProcessor `mapstructure:"processors"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func headersV02ToV03(in configv02.Headers) []config.NameStringValuePair {
 | 
				
			||||||
 | 
						headers := make([]config.NameStringValuePair, len(in))
 | 
				
			||||||
 | 
						idx := 0
 | 
				
			||||||
 | 
						for k, v := range in {
 | 
				
			||||||
 | 
							headers[idx] = config.NameStringValuePair{
 | 
				
			||||||
 | 
								Name:  k,
 | 
				
			||||||
 | 
								Value: &v,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return headers
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func otlpV02ToV03(in *configv02.OTLP) *config.OTLP {
 | 
				
			||||||
 | 
						if in == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &config.OTLP{
 | 
				
			||||||
 | 
							Certificate:       in.Certificate,
 | 
				
			||||||
 | 
							ClientCertificate: in.ClientCertificate,
 | 
				
			||||||
 | 
							ClientKey:         in.ClientKey,
 | 
				
			||||||
 | 
							Compression:       in.Compression,
 | 
				
			||||||
 | 
							Endpoint:          &in.Endpoint,
 | 
				
			||||||
 | 
							Insecure:          in.Insecure,
 | 
				
			||||||
 | 
							Protocol:          &in.Protocol,
 | 
				
			||||||
 | 
							Timeout:           in.Timeout,
 | 
				
			||||||
 | 
							Headers:           headersV02ToV03(in.Headers),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func otlpMetricV02ToV03(in *configv02.OTLPMetric) *config.OTLPMetric {
 | 
				
			||||||
 | 
						if in == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &config.OTLPMetric{
 | 
				
			||||||
 | 
							Certificate:       in.Certificate,
 | 
				
			||||||
 | 
							ClientCertificate: in.ClientCertificate,
 | 
				
			||||||
 | 
							ClientKey:         in.ClientKey,
 | 
				
			||||||
 | 
							Compression:       in.Compression,
 | 
				
			||||||
 | 
							Endpoint:          &in.Endpoint,
 | 
				
			||||||
 | 
							Insecure:          in.Insecure,
 | 
				
			||||||
 | 
							Protocol:          &in.Protocol,
 | 
				
			||||||
 | 
							Timeout:           in.Timeout,
 | 
				
			||||||
 | 
							Headers:           headersV02ToV03(in.Headers),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func zipkinV02ToV03(in *configv02.Zipkin) *config.Zipkin {
 | 
				
			||||||
 | 
						if in == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &config.Zipkin{
 | 
				
			||||||
 | 
							Endpoint: &in.Endpoint,
 | 
				
			||||||
 | 
							Timeout:  in.Timeout,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func tracesConfigV02ToV03(v2 tracesConfigV020, v3 *TracesConfigV030) error {
 | 
				
			||||||
 | 
						processors := make([]config.SpanProcessor, len(v2.Processors))
 | 
				
			||||||
 | 
						for idx, p := range v2.Processors {
 | 
				
			||||||
 | 
							processors[idx] = config.SpanProcessor{}
 | 
				
			||||||
 | 
							if p.Batch != nil {
 | 
				
			||||||
 | 
								processors[idx].Batch = &config.BatchSpanProcessor{
 | 
				
			||||||
 | 
									ExportTimeout:      p.Batch.ExportTimeout,
 | 
				
			||||||
 | 
									MaxExportBatchSize: p.Batch.MaxExportBatchSize,
 | 
				
			||||||
 | 
									MaxQueueSize:       p.Batch.MaxQueueSize,
 | 
				
			||||||
 | 
									ScheduleDelay:      p.Batch.ScheduleDelay,
 | 
				
			||||||
 | 
									Exporter: config.SpanExporter{
 | 
				
			||||||
 | 
										Console:              config.Console(p.Batch.Exporter.Console),
 | 
				
			||||||
 | 
										OTLP:                 otlpV02ToV03(p.Batch.Exporter.OTLP),
 | 
				
			||||||
 | 
										Zipkin:               zipkinV02ToV03(p.Batch.Exporter.Zipkin),
 | 
				
			||||||
 | 
										AdditionalProperties: p.Batch.Exporter.AdditionalProperties,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if p.Simple != nil {
 | 
				
			||||||
 | 
								processors[idx].Simple = &config.SimpleSpanProcessor{
 | 
				
			||||||
 | 
									Exporter: config.SpanExporter{
 | 
				
			||||||
 | 
										Console:              config.Console(p.Simple.Exporter.Console),
 | 
				
			||||||
 | 
										OTLP:                 otlpV02ToV03(p.Simple.Exporter.OTLP),
 | 
				
			||||||
 | 
										Zipkin:               zipkinV02ToV03(p.Simple.Exporter.Zipkin),
 | 
				
			||||||
 | 
										AdditionalProperties: p.Simple.Exporter.AdditionalProperties,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							processors[idx].AdditionalProperties = p.AdditionalProperties
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						v3.Level = v2.Level
 | 
				
			||||||
 | 
						v3.Propagators = v2.Propagators
 | 
				
			||||||
 | 
						v3.Processors = processors
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func prometheusV02ToV03(in *configv02.Prometheus) *config.Prometheus {
 | 
				
			||||||
 | 
						if in == nil {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &config.Prometheus{
 | 
				
			||||||
 | 
							Host:                       in.Host,
 | 
				
			||||||
 | 
							Port:                       in.Port,
 | 
				
			||||||
 | 
							WithoutScopeInfo:           in.WithoutScopeInfo,
 | 
				
			||||||
 | 
							WithoutUnits:               in.WithoutUnits,
 | 
				
			||||||
 | 
							WithoutTypeSuffix:          in.WithoutTypeSuffix,
 | 
				
			||||||
 | 
							WithResourceConstantLabels: (*config.IncludeExclude)(in.WithResourceConstantLabels),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func metricsConfigV02ToV03(v2 metricsConfigV020, v3 *MetricsConfigV030) error {
 | 
				
			||||||
 | 
						readers := make([]config.MetricReader, len(v2.Readers))
 | 
				
			||||||
 | 
						for idx, p := range v2.Readers {
 | 
				
			||||||
 | 
							readers[idx] = config.MetricReader{}
 | 
				
			||||||
 | 
							if p.Periodic != nil {
 | 
				
			||||||
 | 
								readers[idx].Periodic = &config.PeriodicMetricReader{
 | 
				
			||||||
 | 
									Interval: p.Periodic.Interval,
 | 
				
			||||||
 | 
									Timeout:  p.Periodic.Timeout,
 | 
				
			||||||
 | 
									Exporter: config.PushMetricExporter{
 | 
				
			||||||
 | 
										Console:              config.Console(p.Periodic.Exporter.Console),
 | 
				
			||||||
 | 
										OTLP:                 otlpMetricV02ToV03(p.Periodic.Exporter.OTLP),
 | 
				
			||||||
 | 
										AdditionalProperties: p.Periodic.Exporter.AdditionalProperties,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if p.Pull != nil {
 | 
				
			||||||
 | 
								readers[idx].Pull = &config.PullMetricReader{
 | 
				
			||||||
 | 
									Exporter: config.PullMetricExporter{
 | 
				
			||||||
 | 
										Prometheus:           prometheusV02ToV03(p.Pull.Exporter.Prometheus),
 | 
				
			||||||
 | 
										AdditionalProperties: p.Pull.Exporter.AdditionalProperties,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						v3.Level = v2.Level
 | 
				
			||||||
 | 
						v3.Address = v2.Address
 | 
				
			||||||
 | 
						v3.Readers = readers
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func logsConfigV02ToV03(v2 logsConfigV020, v3 *LogsConfigV030) error {
 | 
				
			||||||
 | 
						processors := make([]config.LogRecordProcessor, len(v2.Processors))
 | 
				
			||||||
 | 
						for idx, p := range v2.Processors {
 | 
				
			||||||
 | 
							processors[idx] = config.LogRecordProcessor{}
 | 
				
			||||||
 | 
							if p.Batch != nil {
 | 
				
			||||||
 | 
								processors[idx].Batch = &config.BatchLogRecordProcessor{
 | 
				
			||||||
 | 
									ExportTimeout:      p.Batch.ExportTimeout,
 | 
				
			||||||
 | 
									MaxExportBatchSize: p.Batch.MaxExportBatchSize,
 | 
				
			||||||
 | 
									MaxQueueSize:       p.Batch.MaxQueueSize,
 | 
				
			||||||
 | 
									ScheduleDelay:      p.Batch.ScheduleDelay,
 | 
				
			||||||
 | 
									Exporter: config.LogRecordExporter{
 | 
				
			||||||
 | 
										Console:              config.Console(p.Batch.Exporter.Console),
 | 
				
			||||||
 | 
										OTLP:                 otlpV02ToV03(p.Batch.Exporter.OTLP),
 | 
				
			||||||
 | 
										AdditionalProperties: p.Batch.Exporter.AdditionalProperties,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if p.Simple != nil {
 | 
				
			||||||
 | 
								processors[idx].Simple = &config.SimpleLogRecordProcessor{
 | 
				
			||||||
 | 
									Exporter: config.LogRecordExporter{
 | 
				
			||||||
 | 
										Console:              config.Console(p.Simple.Exporter.Console),
 | 
				
			||||||
 | 
										OTLP:                 otlpV02ToV03(p.Simple.Exporter.OTLP),
 | 
				
			||||||
 | 
										AdditionalProperties: p.Simple.Exporter.AdditionalProperties,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							processors[idx].AdditionalProperties = p.AdditionalProperties
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						v3.Level = v2.Level
 | 
				
			||||||
 | 
						v3.Development = v2.Development
 | 
				
			||||||
 | 
						v3.Encoding = v2.Encoding
 | 
				
			||||||
 | 
						v3.DisableCaller = v2.DisableCaller
 | 
				
			||||||
 | 
						v3.DisableStacktrace = v2.DisableStacktrace
 | 
				
			||||||
 | 
						v3.Sampling = v2.Sampling
 | 
				
			||||||
 | 
						v3.OutputPaths = v2.OutputPaths
 | 
				
			||||||
 | 
						v3.ErrorOutputPaths = v2.ErrorOutputPaths
 | 
				
			||||||
 | 
						v3.InitialFields = v2.InitialFields
 | 
				
			||||||
 | 
						v3.Processors = processors
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					// Copyright The OpenTelemetry Authors
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package migration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"go.opentelemetry.io/collector/confmap/confmaptest"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestUnmarshalLogsConfigV020(t *testing.T) {
 | 
				
			||||||
 | 
						cm, err := confmaptest.LoadConf(filepath.Join("testdata", "v0.2.0_logs.yaml"))
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg := LogsConfigV030{}
 | 
				
			||||||
 | 
						require.NoError(t, cm.Unmarshal(&cfg))
 | 
				
			||||||
 | 
						require.Len(t, cfg.Processors, 2)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestUnmarshalTracesConfigV020(t *testing.T) {
 | 
				
			||||||
 | 
						cm, err := confmaptest.LoadConf(filepath.Join("testdata", "v0.2.0_traces.yaml"))
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg := TracesConfigV030{}
 | 
				
			||||||
 | 
						require.NoError(t, cm.Unmarshal(&cfg))
 | 
				
			||||||
 | 
						require.Len(t, cfg.Processors, 2)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestUnmarshalMetricsConfigV020(t *testing.T) {
 | 
				
			||||||
 | 
						cm, err := confmaptest.LoadConf(filepath.Join("testdata", "v0.2.0_metrics.yaml"))
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg := MetricsConfigV030{}
 | 
				
			||||||
 | 
						require.NoError(t, cm.Unmarshal(&cfg))
 | 
				
			||||||
 | 
						require.Len(t, cfg.Readers, 2)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,174 @@
 | 
				
			||||||
 | 
					// Copyright The OpenTelemetry Authors
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package migration // import "go.opentelemetry.io/collector/service/telemetry/internal/migration"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
 | 
						"go.uber.org/zap/zapcore"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"go.opentelemetry.io/collector/config/configtelemetry"
 | 
				
			||||||
 | 
						"go.opentelemetry.io/collector/confmap"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TracesConfigV030 struct {
 | 
				
			||||||
 | 
						// Level configures whether spans are emitted or not, the possible values are:
 | 
				
			||||||
 | 
						//  - "none" indicates that no tracing data should be collected;
 | 
				
			||||||
 | 
						//  - "basic" is the recommended and covers the basics of the service telemetry.
 | 
				
			||||||
 | 
						Level configtelemetry.Level `mapstructure:"level"`
 | 
				
			||||||
 | 
						// Propagators is a list of TextMapPropagators from the supported propagators list. Currently,
 | 
				
			||||||
 | 
						// tracecontext and  b3 are supported. By default, the value is set to empty list and
 | 
				
			||||||
 | 
						// context propagation is disabled.
 | 
				
			||||||
 | 
						Propagators []string `mapstructure:"propagators"`
 | 
				
			||||||
 | 
						// Processors allow configuration of span processors to emit spans to
 | 
				
			||||||
 | 
						// any number of supported backends.
 | 
				
			||||||
 | 
						Processors []config.SpanProcessor `mapstructure:"processors"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *TracesConfigV030) Unmarshal(conf *confmap.Conf) error {
 | 
				
			||||||
 | 
						if err := conf.Unmarshal(c); err != nil {
 | 
				
			||||||
 | 
							var v2TracesConfig tracesConfigV020
 | 
				
			||||||
 | 
							// try unmarshaling using v0.2.0 struct
 | 
				
			||||||
 | 
							if e := conf.Unmarshal(&v2TracesConfig); e != nil {
 | 
				
			||||||
 | 
								// error could not be resolved through backwards
 | 
				
			||||||
 | 
								// compatibility attempts
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// TODO: add a warning log to tell users to migrate their config
 | 
				
			||||||
 | 
							return tracesConfigV02ToV03(v2TracesConfig, c)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type MetricsConfigV030 struct {
 | 
				
			||||||
 | 
						// Level is the level of telemetry metrics, the possible values are:
 | 
				
			||||||
 | 
						//  - "none" indicates that no telemetry data should be collected;
 | 
				
			||||||
 | 
						//  - "basic" is the recommended and covers the basics of the service telemetry.
 | 
				
			||||||
 | 
						//  - "normal" adds some other indicators on top of basic.
 | 
				
			||||||
 | 
						//  - "detailed" adds dimensions and views to the previous levels.
 | 
				
			||||||
 | 
						Level configtelemetry.Level `mapstructure:"level"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Deprecated: [v0.111.0] use readers configuration.
 | 
				
			||||||
 | 
						Address string `mapstructure:"address"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Readers allow configuration of metric readers to emit metrics to
 | 
				
			||||||
 | 
						// any number of supported backends.
 | 
				
			||||||
 | 
						Readers []config.MetricReader `mapstructure:"readers"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *MetricsConfigV030) Unmarshal(conf *confmap.Conf) error {
 | 
				
			||||||
 | 
						if err := conf.Unmarshal(c); err != nil {
 | 
				
			||||||
 | 
							var v02 metricsConfigV020
 | 
				
			||||||
 | 
							// try unmarshaling using v0.2.0 struct
 | 
				
			||||||
 | 
							if e := conf.Unmarshal(&v02); e != nil {
 | 
				
			||||||
 | 
								// error could not be resolved through backwards
 | 
				
			||||||
 | 
								// compatibility attempts
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// TODO: add a warning log to tell users to migrate their config
 | 
				
			||||||
 | 
							return metricsConfigV02ToV03(v02, c)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type LogsConfigV030 struct {
 | 
				
			||||||
 | 
						// Level is the minimum enabled logging level.
 | 
				
			||||||
 | 
						// (default = "INFO")
 | 
				
			||||||
 | 
						Level zapcore.Level `mapstructure:"level"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Development puts the logger in development mode, which changes the
 | 
				
			||||||
 | 
						// behavior of DPanicLevel and takes stacktraces more liberally.
 | 
				
			||||||
 | 
						// (default = false)
 | 
				
			||||||
 | 
						Development bool `mapstructure:"development"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Encoding sets the logger's encoding.
 | 
				
			||||||
 | 
						// Example values are "json", "console".
 | 
				
			||||||
 | 
						Encoding string `mapstructure:"encoding"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// DisableCaller stops annotating logs with the calling function's file
 | 
				
			||||||
 | 
						// name and line number. By default, all logs are annotated.
 | 
				
			||||||
 | 
						// (default = false)
 | 
				
			||||||
 | 
						DisableCaller bool `mapstructure:"disable_caller"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// DisableStacktrace completely disables automatic stacktrace capturing. By
 | 
				
			||||||
 | 
						// default, stacktraces are captured for WarnLevel and above logs in
 | 
				
			||||||
 | 
						// development and ErrorLevel and above in production.
 | 
				
			||||||
 | 
						// (default = false)
 | 
				
			||||||
 | 
						DisableStacktrace bool `mapstructure:"disable_stacktrace"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Sampling sets a sampling policy.
 | 
				
			||||||
 | 
						// Default:
 | 
				
			||||||
 | 
						// 		sampling:
 | 
				
			||||||
 | 
						//	   		enabled: true
 | 
				
			||||||
 | 
						//	   		tick: 10s
 | 
				
			||||||
 | 
						//	   		initial: 10
 | 
				
			||||||
 | 
						//	   		thereafter: 100
 | 
				
			||||||
 | 
						// Sampling can be disabled by setting 'enabled' to false
 | 
				
			||||||
 | 
						Sampling *LogsSamplingConfig `mapstructure:"sampling"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// OutputPaths is a list of URLs or file paths to write logging output to.
 | 
				
			||||||
 | 
						// The URLs could only be with "file" schema or without schema.
 | 
				
			||||||
 | 
						// The URLs with "file" schema must be an absolute path.
 | 
				
			||||||
 | 
						// The URLs without schema are treated as local file paths.
 | 
				
			||||||
 | 
						// "stdout" and "stderr" are interpreted as os.Stdout and os.Stderr.
 | 
				
			||||||
 | 
						// see details at Open in zap/writer.go.
 | 
				
			||||||
 | 
						// (default = ["stderr"])
 | 
				
			||||||
 | 
						OutputPaths []string `mapstructure:"output_paths"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ErrorOutputPaths is a list of URLs or file paths to write zap internal logger errors to.
 | 
				
			||||||
 | 
						// The URLs could only be with "file" schema or without schema.
 | 
				
			||||||
 | 
						// The URLs with "file" schema must use absolute paths.
 | 
				
			||||||
 | 
						// The URLs without schema are treated as local file paths.
 | 
				
			||||||
 | 
						// "stdout" and "stderr" are interpreted as os.Stdout and os.Stderr.
 | 
				
			||||||
 | 
						// see details at Open in zap/writer.go.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// Note that this setting only affects the zap internal logger errors.
 | 
				
			||||||
 | 
						// (default = ["stderr"])
 | 
				
			||||||
 | 
						ErrorOutputPaths []string `mapstructure:"error_output_paths"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// InitialFields is a collection of fields to add to the root logger.
 | 
				
			||||||
 | 
						// Example:
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// 		initial_fields:
 | 
				
			||||||
 | 
						//	   		foo: "bar"
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// By default, there is no initial field.
 | 
				
			||||||
 | 
						InitialFields map[string]any `mapstructure:"initial_fields"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Processors allow configuration of log record processors to emit logs to
 | 
				
			||||||
 | 
						// any number of suported backends.
 | 
				
			||||||
 | 
						Processors []config.LogRecordProcessor `mapstructure:"processors"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// LogsSamplingConfig sets a sampling strategy for the logger. Sampling caps the
 | 
				
			||||||
 | 
					// global CPU and I/O load that logging puts on your process while attempting
 | 
				
			||||||
 | 
					// to preserve a representative subset of your logs.
 | 
				
			||||||
 | 
					type LogsSamplingConfig struct {
 | 
				
			||||||
 | 
						// Enabled enable sampling logging
 | 
				
			||||||
 | 
						Enabled bool `mapstructure:"enabled"`
 | 
				
			||||||
 | 
						// Tick represents the interval in seconds that the logger apply each sampling.
 | 
				
			||||||
 | 
						Tick time.Duration `mapstructure:"tick"`
 | 
				
			||||||
 | 
						// Initial represents the first M messages logged each Tick.
 | 
				
			||||||
 | 
						Initial int `mapstructure:"initial"`
 | 
				
			||||||
 | 
						// Thereafter represents the sampling rate, every Nth message will be sampled after Initial messages are logged during each Tick.
 | 
				
			||||||
 | 
						// If Thereafter is zero, the logger will drop all the messages after the Initial each Tick.
 | 
				
			||||||
 | 
						Thereafter int `mapstructure:"thereafter"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *LogsConfigV030) Unmarshal(conf *confmap.Conf) error {
 | 
				
			||||||
 | 
						if err := conf.Unmarshal(c); err != nil {
 | 
				
			||||||
 | 
							var v02 logsConfigV020
 | 
				
			||||||
 | 
							// try unmarshaling using v0.2.0 struct
 | 
				
			||||||
 | 
							if e := conf.Unmarshal(&v02); e != nil {
 | 
				
			||||||
 | 
								// error could not be resolved through backwards
 | 
				
			||||||
 | 
								// compatibility attempts
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// TODO: add a warning log to tell users to migrate their config
 | 
				
			||||||
 | 
							return logsConfigV02ToV03(v02, c)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					// Copyright The OpenTelemetry Authors
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package migration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"go.opentelemetry.io/collector/confmap/confmaptest"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestUnmarshalLogsConfigV030(t *testing.T) {
 | 
				
			||||||
 | 
						cm, err := confmaptest.LoadConf(filepath.Join("testdata", "v0.3.0_logs.yaml"))
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg := LogsConfigV030{}
 | 
				
			||||||
 | 
						require.NoError(t, cm.Unmarshal(&cfg))
 | 
				
			||||||
 | 
						require.Len(t, cfg.Processors, 2)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestUnmarshalTracesConfigV030(t *testing.T) {
 | 
				
			||||||
 | 
						cm, err := confmaptest.LoadConf(filepath.Join("testdata", "v0.3.0_traces.yaml"))
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg := TracesConfigV030{}
 | 
				
			||||||
 | 
						require.NoError(t, cm.Unmarshal(&cfg))
 | 
				
			||||||
 | 
						require.Len(t, cfg.Processors, 2)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestUnmarshalMetricsConfigV030(t *testing.T) {
 | 
				
			||||||
 | 
						cm, err := confmaptest.LoadConf(filepath.Join("testdata", "v0.3.0_metrics.yaml"))
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg := MetricsConfigV030{}
 | 
				
			||||||
 | 
						require.NoError(t, cm.Unmarshal(&cfg))
 | 
				
			||||||
 | 
						require.Len(t, cfg.Readers, 2)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,341 +0,0 @@
 | 
				
			||||||
// Copyright The OpenTelemetry Authors
 | 
					 | 
				
			||||||
// SPDX-License-Identifier: Apache-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package otelinit // import "go.opentelemetry.io/collector/service/telemetry/internal/otelinit"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"context"
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"net"
 | 
					 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"net/url"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"sync"
 | 
					 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/prometheus/client_golang/prometheus"
 | 
					 | 
				
			||||||
	"github.com/prometheus/client_golang/prometheus/promhttp"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/attribute"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
 | 
					 | 
				
			||||||
	otelprom "go.opentelemetry.io/otel/exporters/prometheus"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/sdk/instrumentation"
 | 
					 | 
				
			||||||
	sdkmetric "go.opentelemetry.io/otel/sdk/metric"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/sdk/metric/metricdata"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/sdk/resource"
 | 
					 | 
				
			||||||
	"google.golang.org/grpc/credentials"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	semconv "go.opentelemetry.io/collector/semconv/v1.18.0"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// gRPC Instrumentation Name
 | 
					 | 
				
			||||||
	GRPCInstrumentation = "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// http Instrumentation Name
 | 
					 | 
				
			||||||
	HTTPInstrumentation = "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// supported protocols
 | 
					 | 
				
			||||||
	protocolProtobufHTTP     = "http/protobuf"
 | 
					 | 
				
			||||||
	protocolProtobufGRPC     = "grpc/protobuf"
 | 
					 | 
				
			||||||
	defaultReadHeaderTimeout = 10 * time.Second
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	// GRPCUnacceptableKeyValues is a list of high cardinality grpc attributes that should be filtered out.
 | 
					 | 
				
			||||||
	GRPCUnacceptableKeyValues = attribute.NewSet(
 | 
					 | 
				
			||||||
		attribute.String(semconv.AttributeNetSockPeerAddr, ""),
 | 
					 | 
				
			||||||
		attribute.String(semconv.AttributeNetSockPeerPort, ""),
 | 
					 | 
				
			||||||
		attribute.String(semconv.AttributeNetSockPeerName, ""),
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// HTTPUnacceptableKeyValues is a list of high cardinality http attributes that should be filtered out.
 | 
					 | 
				
			||||||
	HTTPUnacceptableKeyValues = attribute.NewSet(
 | 
					 | 
				
			||||||
		attribute.String(semconv.AttributeNetHostName, ""),
 | 
					 | 
				
			||||||
		attribute.String(semconv.AttributeNetHostPort, ""),
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	errNoValidMetricExporter = errors.New("no valid metric exporter")
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func InitMetricReader(ctx context.Context, reader config.MetricReader, asyncErrorChannel chan error, serverWG *sync.WaitGroup) (sdkmetric.Reader, *http.Server, error) {
 | 
					 | 
				
			||||||
	if reader.Pull != nil {
 | 
					 | 
				
			||||||
		return initPullExporter(reader.Pull.Exporter, asyncErrorChannel, serverWG)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if reader.Periodic != nil {
 | 
					 | 
				
			||||||
		var opts []sdkmetric.PeriodicReaderOption
 | 
					 | 
				
			||||||
		if reader.Periodic.Interval != nil {
 | 
					 | 
				
			||||||
			opts = append(opts, sdkmetric.WithInterval(time.Duration(*reader.Periodic.Interval)*time.Millisecond))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if reader.Periodic.Timeout != nil {
 | 
					 | 
				
			||||||
			opts = append(opts, sdkmetric.WithTimeout(time.Duration(*reader.Periodic.Timeout)*time.Millisecond))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return initPeriodicExporter(ctx, reader.Periodic.Exporter, opts...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil, nil, fmt.Errorf("unsupported metric reader type %v", reader)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func InitOpenTelemetry(res *resource.Resource, options []sdkmetric.Option, disableHighCardinality bool) (*sdkmetric.MeterProvider, error) {
 | 
					 | 
				
			||||||
	opts := []sdkmetric.Option{
 | 
					 | 
				
			||||||
		sdkmetric.WithResource(res),
 | 
					 | 
				
			||||||
		sdkmetric.WithView(disableHighCardinalityViews(disableHighCardinality)...),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	opts = append(opts, options...)
 | 
					 | 
				
			||||||
	return sdkmetric.NewMeterProvider(
 | 
					 | 
				
			||||||
		opts...,
 | 
					 | 
				
			||||||
	), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func InitPrometheusServer(registry *prometheus.Registry, address string, asyncErrorChannel chan error, serverWG *sync.WaitGroup) *http.Server {
 | 
					 | 
				
			||||||
	mux := http.NewServeMux()
 | 
					 | 
				
			||||||
	mux.Handle("/metrics", promhttp.HandlerFor(registry, promhttp.HandlerOpts{}))
 | 
					 | 
				
			||||||
	server := &http.Server{
 | 
					 | 
				
			||||||
		Addr:              address,
 | 
					 | 
				
			||||||
		Handler:           mux,
 | 
					 | 
				
			||||||
		ReadHeaderTimeout: defaultReadHeaderTimeout,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	serverWG.Add(1)
 | 
					 | 
				
			||||||
	go func() {
 | 
					 | 
				
			||||||
		defer serverWG.Done()
 | 
					 | 
				
			||||||
		if serveErr := server.ListenAndServe(); serveErr != nil && !errors.Is(serveErr, http.ErrServerClosed) {
 | 
					 | 
				
			||||||
			select {
 | 
					 | 
				
			||||||
			case asyncErrorChannel <- serveErr:
 | 
					 | 
				
			||||||
			case <-time.After(1 * time.Second):
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	return server
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func disableHighCardinalityViews(disableHighCardinality bool) []sdkmetric.View {
 | 
					 | 
				
			||||||
	if !disableHighCardinality {
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return []sdkmetric.View{
 | 
					 | 
				
			||||||
		sdkmetric.NewView(
 | 
					 | 
				
			||||||
			sdkmetric.Instrument{Scope: instrumentation.Scope{Name: GRPCInstrumentation}},
 | 
					 | 
				
			||||||
			sdkmetric.Stream{
 | 
					 | 
				
			||||||
				AttributeFilter: cardinalityFilter(GRPCUnacceptableKeyValues),
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
		sdkmetric.NewView(
 | 
					 | 
				
			||||||
			sdkmetric.Instrument{Scope: instrumentation.Scope{Name: HTTPInstrumentation}},
 | 
					 | 
				
			||||||
			sdkmetric.Stream{
 | 
					 | 
				
			||||||
				AttributeFilter: cardinalityFilter(HTTPUnacceptableKeyValues),
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func cardinalityFilter(filter attribute.Set) attribute.Filter {
 | 
					 | 
				
			||||||
	return func(kv attribute.KeyValue) bool {
 | 
					 | 
				
			||||||
		return !filter.HasValue(kv.Key)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func initPrometheusExporter(prometheusConfig *config.Prometheus, asyncErrorChannel chan error, serverWG *sync.WaitGroup) (sdkmetric.Reader, *http.Server, error) {
 | 
					 | 
				
			||||||
	promRegistry := prometheus.NewRegistry()
 | 
					 | 
				
			||||||
	if prometheusConfig.Host == nil {
 | 
					 | 
				
			||||||
		return nil, nil, errors.New("host must be specified")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if prometheusConfig.Port == nil {
 | 
					 | 
				
			||||||
		return nil, nil, errors.New("port must be specified")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	opts := []otelprom.Option{
 | 
					 | 
				
			||||||
		otelprom.WithRegisterer(promRegistry),
 | 
					 | 
				
			||||||
		// https://github.com/open-telemetry/opentelemetry-collector/issues/8043
 | 
					 | 
				
			||||||
		otelprom.WithoutUnits(),
 | 
					 | 
				
			||||||
		// Disabled for the moment until this becomes stable, and we are ready to break backwards compatibility.
 | 
					 | 
				
			||||||
		otelprom.WithoutScopeInfo(),
 | 
					 | 
				
			||||||
		// This allows us to produce metrics that are backwards compatible w/ opencensus
 | 
					 | 
				
			||||||
		otelprom.WithoutCounterSuffixes(),
 | 
					 | 
				
			||||||
		otelprom.WithResourceAsConstantLabels(attribute.NewDenyKeysFilter()),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	exporter, err := otelprom.New(opts...)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, nil, fmt.Errorf("error creating otel prometheus exporter: %w", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return exporter, InitPrometheusServer(promRegistry, net.JoinHostPort(*prometheusConfig.Host, strconv.Itoa(*prometheusConfig.Port)), asyncErrorChannel, serverWG), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func initPullExporter(exporter config.MetricExporter, asyncErrorChannel chan error, serverWG *sync.WaitGroup) (sdkmetric.Reader, *http.Server, error) {
 | 
					 | 
				
			||||||
	if exporter.Prometheus != nil {
 | 
					 | 
				
			||||||
		return initPrometheusExporter(exporter.Prometheus, asyncErrorChannel, serverWG)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil, nil, errNoValidMetricExporter
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func initPeriodicExporter(ctx context.Context, exporter config.MetricExporter, opts ...sdkmetric.PeriodicReaderOption) (sdkmetric.Reader, *http.Server, error) {
 | 
					 | 
				
			||||||
	if exporter.Console != nil {
 | 
					 | 
				
			||||||
		enc := json.NewEncoder(os.Stdout)
 | 
					 | 
				
			||||||
		enc.SetIndent("", "  ")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		exp, err := stdoutmetric.New(
 | 
					 | 
				
			||||||
			stdoutmetric.WithEncoder(enc),
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return sdkmetric.NewPeriodicReader(exp, opts...), nil, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if exporter.OTLP != nil {
 | 
					 | 
				
			||||||
		var err error
 | 
					 | 
				
			||||||
		var exp sdkmetric.Exporter
 | 
					 | 
				
			||||||
		switch exporter.OTLP.Protocol {
 | 
					 | 
				
			||||||
		case protocolProtobufHTTP:
 | 
					 | 
				
			||||||
			exp, err = initOTLPHTTPExporter(ctx, exporter.OTLP)
 | 
					 | 
				
			||||||
		case protocolProtobufGRPC:
 | 
					 | 
				
			||||||
			exp, err = initOTLPgRPCExporter(ctx, exporter.OTLP)
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return nil, nil, fmt.Errorf("unsupported protocol %s", exporter.OTLP.Protocol)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return sdkmetric.NewPeriodicReader(exp, opts...), nil, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil, nil, errNoValidMetricExporter
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func normalizeEndpoint(endpoint string) string {
 | 
					 | 
				
			||||||
	if !strings.HasPrefix(endpoint, "https://") && !strings.HasPrefix(endpoint, "http://") {
 | 
					 | 
				
			||||||
		return "http://" + endpoint
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return endpoint
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func initOTLPgRPCExporter(ctx context.Context, otlpConfig *config.OTLPMetric) (sdkmetric.Exporter, error) {
 | 
					 | 
				
			||||||
	opts := []otlpmetricgrpc.Option{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(otlpConfig.Endpoint) > 0 {
 | 
					 | 
				
			||||||
		u, err := url.ParseRequestURI(normalizeEndpoint(otlpConfig.Endpoint))
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		opts = append(opts, otlpmetricgrpc.WithEndpoint(u.Host))
 | 
					 | 
				
			||||||
		if u.Scheme == "http" {
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetricgrpc.WithInsecure())
 | 
					 | 
				
			||||||
		} else if otlpConfig.Certificate != nil {
 | 
					 | 
				
			||||||
			creds, err := credentials.NewClientTLSFromFile(*otlpConfig.Certificate, "")
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return nil, fmt.Errorf("could not create client tls credentials: %w", err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetricgrpc.WithTLSCredentials(creds))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if otlpConfig.Compression != nil {
 | 
					 | 
				
			||||||
		switch *otlpConfig.Compression {
 | 
					 | 
				
			||||||
		case "gzip":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetricgrpc.WithCompressor(*otlpConfig.Compression))
 | 
					 | 
				
			||||||
		case "none":
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return nil, fmt.Errorf("unsupported compression %q", *otlpConfig.Compression)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if otlpConfig.Timeout != nil {
 | 
					 | 
				
			||||||
		opts = append(opts, otlpmetricgrpc.WithTimeout(time.Millisecond*time.Duration(*otlpConfig.Timeout)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if len(otlpConfig.Headers) > 0 {
 | 
					 | 
				
			||||||
		opts = append(opts, otlpmetricgrpc.WithHeaders(otlpConfig.Headers))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if otlpConfig.TemporalityPreference != nil {
 | 
					 | 
				
			||||||
		switch *otlpConfig.TemporalityPreference {
 | 
					 | 
				
			||||||
		case "delta":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetricgrpc.WithTemporalitySelector(temporalityPreferenceDelta))
 | 
					 | 
				
			||||||
		case "cumulative":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetricgrpc.WithTemporalitySelector(temporalityPreferenceCumulative))
 | 
					 | 
				
			||||||
		case "lowmemory":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetricgrpc.WithTemporalitySelector(temporalityPreferenceLowMemory))
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return nil, fmt.Errorf("unsupported temporality preference %q", *otlpConfig.TemporalityPreference)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return otlpmetricgrpc.New(ctx, opts...)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func initOTLPHTTPExporter(ctx context.Context, otlpConfig *config.OTLPMetric) (sdkmetric.Exporter, error) {
 | 
					 | 
				
			||||||
	opts := []otlpmetrichttp.Option{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(otlpConfig.Endpoint) > 0 {
 | 
					 | 
				
			||||||
		u, err := url.ParseRequestURI(normalizeEndpoint(otlpConfig.Endpoint))
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		opts = append(opts, otlpmetrichttp.WithEndpoint(u.Host))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if u.Scheme == "http" {
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetrichttp.WithInsecure())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if len(u.Path) > 0 {
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetrichttp.WithURLPath(u.Path))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if otlpConfig.Compression != nil {
 | 
					 | 
				
			||||||
		switch *otlpConfig.Compression {
 | 
					 | 
				
			||||||
		case "gzip":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetrichttp.WithCompression(otlpmetrichttp.GzipCompression))
 | 
					 | 
				
			||||||
		case "none":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetrichttp.WithCompression(otlpmetrichttp.NoCompression))
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return nil, fmt.Errorf("unsupported compression %q", *otlpConfig.Compression)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if otlpConfig.Timeout != nil {
 | 
					 | 
				
			||||||
		opts = append(opts, otlpmetrichttp.WithTimeout(time.Millisecond*time.Duration(*otlpConfig.Timeout)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if len(otlpConfig.Headers) > 0 {
 | 
					 | 
				
			||||||
		opts = append(opts, otlpmetrichttp.WithHeaders(otlpConfig.Headers))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if otlpConfig.TemporalityPreference != nil {
 | 
					 | 
				
			||||||
		switch *otlpConfig.TemporalityPreference {
 | 
					 | 
				
			||||||
		case "delta":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetrichttp.WithTemporalitySelector(temporalityPreferenceDelta))
 | 
					 | 
				
			||||||
		case "cumulative":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetrichttp.WithTemporalitySelector(temporalityPreferenceCumulative))
 | 
					 | 
				
			||||||
		case "lowmemory":
 | 
					 | 
				
			||||||
			opts = append(opts, otlpmetrichttp.WithTemporalitySelector(temporalityPreferenceLowMemory))
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return nil, fmt.Errorf("unsupported temporality preference %q", *otlpConfig.TemporalityPreference)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return otlpmetrichttp.New(ctx, opts...)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func temporalityPreferenceCumulative(_ sdkmetric.InstrumentKind) metricdata.Temporality {
 | 
					 | 
				
			||||||
	return metricdata.CumulativeTemporality
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func temporalityPreferenceDelta(ik sdkmetric.InstrumentKind) metricdata.Temporality {
 | 
					 | 
				
			||||||
	switch ik {
 | 
					 | 
				
			||||||
	case sdkmetric.InstrumentKindCounter, sdkmetric.InstrumentKindObservableCounter, sdkmetric.InstrumentKindHistogram:
 | 
					 | 
				
			||||||
		return metricdata.DeltaTemporality
 | 
					 | 
				
			||||||
	case sdkmetric.InstrumentKindObservableUpDownCounter, sdkmetric.InstrumentKindUpDownCounter:
 | 
					 | 
				
			||||||
		return metricdata.CumulativeTemporality
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return metricdata.DeltaTemporality
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func temporalityPreferenceLowMemory(ik sdkmetric.InstrumentKind) metricdata.Temporality {
 | 
					 | 
				
			||||||
	switch ik {
 | 
					 | 
				
			||||||
	case sdkmetric.InstrumentKindCounter, sdkmetric.InstrumentKindHistogram:
 | 
					 | 
				
			||||||
		return metricdata.DeltaTemporality
 | 
					 | 
				
			||||||
	case sdkmetric.InstrumentKindObservableCounter, sdkmetric.InstrumentKindObservableUpDownCounter, sdkmetric.InstrumentKindUpDownCounter:
 | 
					 | 
				
			||||||
		return metricdata.CumulativeTemporality
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return metricdata.DeltaTemporality
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,601 +0,0 @@
 | 
				
			||||||
// Copyright The OpenTelemetry Authors
 | 
					 | 
				
			||||||
// SPDX-License-Identifier: Apache-2.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package otelinit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"context"
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"net/url"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"sync"
 | 
					 | 
				
			||||||
	"testing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
					 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
 | 
					 | 
				
			||||||
	otelprom "go.opentelemetry.io/otel/exporters/prometheus"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
 | 
					 | 
				
			||||||
	sdkmetric "go.opentelemetry.io/otel/sdk/metric"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func strPtr(s string) *string {
 | 
					 | 
				
			||||||
	return &s
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func intPtr(i int) *int {
 | 
					 | 
				
			||||||
	return &i
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func TestMetricReader(t *testing.T) {
 | 
					 | 
				
			||||||
	consoleExporter, err := stdoutmetric.New(
 | 
					 | 
				
			||||||
		stdoutmetric.WithPrettyPrint(),
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
	require.NoError(t, err)
 | 
					 | 
				
			||||||
	ctx := context.Background()
 | 
					 | 
				
			||||||
	otlpGRPCExporter, err := otlpmetricgrpc.New(ctx)
 | 
					 | 
				
			||||||
	require.NoError(t, err)
 | 
					 | 
				
			||||||
	otlpHTTPExporter, err := otlpmetrichttp.New(ctx)
 | 
					 | 
				
			||||||
	require.NoError(t, err)
 | 
					 | 
				
			||||||
	promExporter, err := otelprom.New()
 | 
					 | 
				
			||||||
	require.NoError(t, err)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	testCases := []struct {
 | 
					 | 
				
			||||||
		name       string
 | 
					 | 
				
			||||||
		reader     config.MetricReader
 | 
					 | 
				
			||||||
		args       any
 | 
					 | 
				
			||||||
		wantErr    error
 | 
					 | 
				
			||||||
		wantReader sdkmetric.Reader
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name:    "noreader",
 | 
					 | 
				
			||||||
			wantErr: errors.New("unsupported metric reader type {<nil> <nil>}"),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "pull prometheus invalid exporter",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Pull: &config.PullMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errNoValidMetricExporter,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "pull/prometheus-invalid-config-no-host",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Pull: &config.PullMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						Prometheus: &config.Prometheus{},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errors.New("host must be specified"),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "pull/prometheus-invalid-config-no-port",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Pull: &config.PullMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						Prometheus: &config.Prometheus{
 | 
					 | 
				
			||||||
							Host: strPtr("localhost"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errors.New("port must be specified"),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "pull/prometheus-valid",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Pull: &config.PullMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						Prometheus: &config.Prometheus{
 | 
					 | 
				
			||||||
							Host: strPtr("localhost"),
 | 
					 | 
				
			||||||
							Port: intPtr(8080),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: promExporter,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/invalid-exporter",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						Prometheus: &config.Prometheus{
 | 
					 | 
				
			||||||
							Host: strPtr("localhost"),
 | 
					 | 
				
			||||||
							Port: intPtr(8080),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errNoValidMetricExporter,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/no-exporter",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errNoValidMetricExporter,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/console-exporter",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						Console: config.Console{},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(consoleExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/console-exporter-with-timeout-interval",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Interval: intPtr(10),
 | 
					 | 
				
			||||||
					Timeout:  intPtr(5),
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						Console: config.Console{},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(consoleExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-exporter-invalid-protocol",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol: *strPtr("http/invalid"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errors.New("unsupported protocol http/invalid"),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-exporter-no-endpoint",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpGRPCExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-exporter",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "http://localhost:4317",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpGRPCExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-exporter-no-scheme",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4317",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpGRPCExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-invalid-endpoint",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    " ",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: &url.Error{Op: "parse", URL: "http:// ", Err: url.InvalidHostError(" ")},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-invalid-compression",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4317",
 | 
					 | 
				
			||||||
							Compression: strPtr("invalid"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errors.New("unsupported compression \"invalid\""),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-delta-temporality",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
							TemporalityPreference: strPtr("delta"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpGRPCExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-cumulative-temporality",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
							TemporalityPreference: strPtr("cumulative"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpGRPCExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-lowmemory-temporality",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
							TemporalityPreference: strPtr("lowmemory"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpGRPCExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-invalid-temporality",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
							TemporalityPreference: strPtr("invalid"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errors.New("unsupported temporality preference \"invalid\""),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-exporter",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "http://localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpHTTPExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-exporter-with-path",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "http://localhost:4318/path/123",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpHTTPExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-exporter-no-endpoint",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpHTTPExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-exporter-no-scheme",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpHTTPExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-invalid-endpoint",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    " ",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: &url.Error{Op: "parse", URL: "http:// ", Err: url.InvalidHostError(" ")},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-invalid-compression",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("invalid"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errors.New("unsupported compression \"invalid\""),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-cumulative-temporality",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
							TemporalityPreference: strPtr("cumulative"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpHTTPExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-lowmemory-temporality",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
							TemporalityPreference: strPtr("lowmemory"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpHTTPExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-delta-temporality",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
							TemporalityPreference: strPtr("delta"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpHTTPExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-http-invalid-temporality",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "http/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "localhost:4318",
 | 
					 | 
				
			||||||
							Compression: strPtr("none"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
							TemporalityPreference: strPtr("invalid"),
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: errors.New("unsupported temporality preference \"invalid\""),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-good-ca-certificate",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "https://localhost:4317",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Certificate: strPtr(filepath.Join("testdata", "ca.crt")),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantReader: sdkmetric.NewPeriodicReader(otlpGRPCExporter),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name: "periodic/otlp-grpc-bad-ca-certificate",
 | 
					 | 
				
			||||||
			reader: config.MetricReader{
 | 
					 | 
				
			||||||
				Periodic: &config.PeriodicMetricReader{
 | 
					 | 
				
			||||||
					Exporter: config.MetricExporter{
 | 
					 | 
				
			||||||
						OTLP: &config.OTLPMetric{
 | 
					 | 
				
			||||||
							Protocol:    "grpc/protobuf",
 | 
					 | 
				
			||||||
							Endpoint:    "https://localhost:4317",
 | 
					 | 
				
			||||||
							Compression: strPtr("gzip"),
 | 
					 | 
				
			||||||
							Timeout:     intPtr(1000),
 | 
					 | 
				
			||||||
							Certificate: strPtr(filepath.Join("testdata", "bad_cert.crt")),
 | 
					 | 
				
			||||||
							Headers: map[string]string{
 | 
					 | 
				
			||||||
								"test": "test1",
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			wantErr: fmt.Errorf("could not create client tls credentials: %w", errors.New("credentials: failed to append certificates")),
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for _, tt := range testCases {
 | 
					 | 
				
			||||||
		t.Run(tt.name, func(t *testing.T) {
 | 
					 | 
				
			||||||
			gotReader, server, err := InitMetricReader(context.Background(), tt.reader, make(chan error), &sync.WaitGroup{})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			defer func() {
 | 
					 | 
				
			||||||
				if gotReader != nil {
 | 
					 | 
				
			||||||
					require.NoError(t, gotReader.Shutdown(context.Background()))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if server != nil {
 | 
					 | 
				
			||||||
					assert.NoError(t, server.Shutdown(context.Background()))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			assert.Equal(t, tt.wantErr, err)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if tt.wantReader == nil {
 | 
					 | 
				
			||||||
				assert.Nil(t, gotReader)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				assert.Equal(t, reflect.TypeOf(tt.wantReader), reflect.TypeOf(gotReader))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if reflect.TypeOf(tt.wantReader).String() == "*metric.PeriodicReader" {
 | 
					 | 
				
			||||||
					wantExporterType := reflect.Indirect(reflect.ValueOf(tt.wantReader)).FieldByName("exporter").Elem().Type()
 | 
					 | 
				
			||||||
					gotExporterType := reflect.Indirect(reflect.ValueOf(gotReader)).FieldByName("exporter").Elem().Type()
 | 
					 | 
				
			||||||
					assert.Equal(t, wantExporterType, gotExporterType)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ import (
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	"go.uber.org/zap/zapcore"
 | 
						"go.uber.org/zap/zapcore"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,179 +4,22 @@
 | 
				
			||||||
package telemetry // import "go.opentelemetry.io/collector/service/telemetry"
 | 
					package telemetry // import "go.opentelemetry.io/collector/service/telemetry"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"errors"
 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"sync"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/metric"
 | 
						"go.opentelemetry.io/otel/metric"
 | 
				
			||||||
	"go.opentelemetry.io/otel/metric/noop"
 | 
						"go.opentelemetry.io/otel/metric/noop"
 | 
				
			||||||
	"go.opentelemetry.io/otel/sdk/instrumentation"
 | 
					 | 
				
			||||||
	sdkmetric "go.opentelemetry.io/otel/sdk/metric"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/otel/sdk/resource"
 | 
					 | 
				
			||||||
	"go.uber.org/multierr"
 | 
					 | 
				
			||||||
	"go.uber.org/zap"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/config/configtelemetry"
 | 
						"go.opentelemetry.io/collector/config/configtelemetry"
 | 
				
			||||||
	"go.opentelemetry.io/collector/service/telemetry/internal/otelinit"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	zapKeyTelemetryAddress = "address"
 | 
					 | 
				
			||||||
	zapKeyTelemetryLevel   = "metrics level"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type meterProvider struct {
 | 
					 | 
				
			||||||
	*sdkmetric.MeterProvider
 | 
					 | 
				
			||||||
	servers  []*http.Server
 | 
					 | 
				
			||||||
	serverWG sync.WaitGroup
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type meterProviderSettings struct {
 | 
					 | 
				
			||||||
	res               *resource.Resource
 | 
					 | 
				
			||||||
	cfg               MetricsConfig
 | 
					 | 
				
			||||||
	asyncErrorChannel chan error
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func dropViewOption(instrument sdkmetric.Instrument) sdkmetric.Option {
 | 
					 | 
				
			||||||
	return sdkmetric.WithView(sdkmetric.NewView(
 | 
					 | 
				
			||||||
		instrument,
 | 
					 | 
				
			||||||
		sdkmetric.Stream{
 | 
					 | 
				
			||||||
			Aggregation: sdkmetric.AggregationDrop{},
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// newMeterProvider creates a new MeterProvider from Config.
 | 
					// newMeterProvider creates a new MeterProvider from Config.
 | 
				
			||||||
func newMeterProvider(set meterProviderSettings, disableHighCardinality bool) (metric.MeterProvider, error) {
 | 
					func newMeterProvider(set Settings, cfg Config) (metric.MeterProvider, error) {
 | 
				
			||||||
	if set.cfg.Level == configtelemetry.LevelNone || len(set.cfg.Readers) == 0 {
 | 
						if cfg.Metrics.Level == configtelemetry.LevelNone || len(cfg.Metrics.Readers) == 0 {
 | 
				
			||||||
		return noop.NewMeterProvider(), nil
 | 
							return noop.NewMeterProvider(), nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mp := &meterProvider{}
 | 
						if set.SDK != nil {
 | 
				
			||||||
	var opts []sdkmetric.Option
 | 
							return set.SDK.MeterProvider(), nil
 | 
				
			||||||
	for _, reader := range set.cfg.Readers {
 | 
					 | 
				
			||||||
		// https://github.com/open-telemetry/opentelemetry-collector/issues/8045
 | 
					 | 
				
			||||||
		r, server, err := otelinit.InitMetricReader(context.Background(), reader, set.asyncErrorChannel, &mp.serverWG)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if server != nil {
 | 
					 | 
				
			||||||
			mp.servers = append(mp.servers, server)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		opts = append(opts, sdkmetric.WithReader(r))
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return nil, errors.New("no sdk set")
 | 
				
			||||||
	if set.cfg.Level < configtelemetry.LevelDetailed {
 | 
					 | 
				
			||||||
		// Drop all otelhttp and otelgrpc metrics if the level is not detailed.
 | 
					 | 
				
			||||||
		opts = append(opts,
 | 
					 | 
				
			||||||
			dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
				Scope: instrumentation.Scope{Name: otelhttp.ScopeName},
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
				Scope: instrumentation.Scope{Name: otelgrpc.ScopeName},
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// otel-arrow library metrics
 | 
					 | 
				
			||||||
	// See https://github.com/open-telemetry/otel-arrow/blob/c39257/pkg/otel/arrow_record/consumer.go#L174-L176
 | 
					 | 
				
			||||||
	if set.cfg.Level < configtelemetry.LevelNormal {
 | 
					 | 
				
			||||||
		scope := instrumentation.Scope{Name: "otel-arrow/pkg/otel/arrow_record"}
 | 
					 | 
				
			||||||
		opts = append(opts,
 | 
					 | 
				
			||||||
			dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
				Name:  "arrow_batch_records",
 | 
					 | 
				
			||||||
				Scope: scope,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
				Name:  "arrow_schema_resets",
 | 
					 | 
				
			||||||
				Scope: scope,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
			dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
				Name:  "arrow_memory_inuse",
 | 
					 | 
				
			||||||
				Scope: scope,
 | 
					 | 
				
			||||||
			}),
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// contrib's internal/otelarrow/netstats metrics
 | 
					 | 
				
			||||||
	// See
 | 
					 | 
				
			||||||
	// - https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a25f05/internal/otelarrow/netstats/netstats.go#L130
 | 
					 | 
				
			||||||
	// - https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/a25f05/internal/otelarrow/netstats/netstats.go#L165
 | 
					 | 
				
			||||||
	if set.cfg.Level < configtelemetry.LevelDetailed {
 | 
					 | 
				
			||||||
		scope := instrumentation.Scope{Name: "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats"}
 | 
					 | 
				
			||||||
		// Compressed size metrics.
 | 
					 | 
				
			||||||
		opts = append(opts, dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
			Name:  "otelcol_*_compressed_size",
 | 
					 | 
				
			||||||
			Scope: scope,
 | 
					 | 
				
			||||||
		}))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		opts = append(opts, dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
			Name:  "otelcol_*_compressed_size",
 | 
					 | 
				
			||||||
			Scope: scope,
 | 
					 | 
				
			||||||
		}))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// makeRecvMetrics for exporters.
 | 
					 | 
				
			||||||
		opts = append(opts, dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
			Name:  "otelcol_exporter_recv",
 | 
					 | 
				
			||||||
			Scope: scope,
 | 
					 | 
				
			||||||
		}))
 | 
					 | 
				
			||||||
		opts = append(opts, dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
			Name:  "otelcol_exporter_recv_wire",
 | 
					 | 
				
			||||||
			Scope: scope,
 | 
					 | 
				
			||||||
		}))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// makeSentMetrics for receivers.
 | 
					 | 
				
			||||||
		opts = append(opts, dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
			Name:  "otelcol_receiver_sent",
 | 
					 | 
				
			||||||
			Scope: scope,
 | 
					 | 
				
			||||||
		}))
 | 
					 | 
				
			||||||
		opts = append(opts, dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
			Name:  "otelcol_receiver_sent_wire",
 | 
					 | 
				
			||||||
			Scope: scope,
 | 
					 | 
				
			||||||
		}))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Batch processor metrics
 | 
					 | 
				
			||||||
	if set.cfg.Level < configtelemetry.LevelDetailed {
 | 
					 | 
				
			||||||
		scope := instrumentation.Scope{Name: "go.opentelemetry.io/collector/processor/batchprocessor"}
 | 
					 | 
				
			||||||
		opts = append(opts, dropViewOption(sdkmetric.Instrument{
 | 
					 | 
				
			||||||
			Name:  "otelcol_processor_batch_batch_send_size_bytes",
 | 
					 | 
				
			||||||
			Scope: scope,
 | 
					 | 
				
			||||||
		}))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var err error
 | 
					 | 
				
			||||||
	mp.MeterProvider, err = otelinit.InitOpenTelemetry(set.res, opts, disableHighCardinality)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return mp, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// LogAboutServers logs about the servers that are serving metrics.
 | 
					 | 
				
			||||||
func (mp *meterProvider) LogAboutServers(logger *zap.Logger, cfg MetricsConfig) {
 | 
					 | 
				
			||||||
	for _, server := range mp.servers {
 | 
					 | 
				
			||||||
		logger.Info(
 | 
					 | 
				
			||||||
			"Serving metrics",
 | 
					 | 
				
			||||||
			zap.String(zapKeyTelemetryAddress, server.Addr),
 | 
					 | 
				
			||||||
			zap.Stringer(zapKeyTelemetryLevel, cfg.Level),
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Shutdown the meter provider and all the associated resources.
 | 
					 | 
				
			||||||
// The type signature of this method matches that of the sdkmetric.MeterProvider.
 | 
					 | 
				
			||||||
func (mp *meterProvider) Shutdown(ctx context.Context) error {
 | 
					 | 
				
			||||||
	var errs error
 | 
					 | 
				
			||||||
	for _, server := range mp.servers {
 | 
					 | 
				
			||||||
		if server != nil {
 | 
					 | 
				
			||||||
			errs = multierr.Append(errs, server.Close())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	errs = multierr.Append(errs, mp.MeterProvider.Shutdown(ctx))
 | 
					 | 
				
			||||||
	mp.serverWG.Wait()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return errs
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,16 +14,13 @@ import (
 | 
				
			||||||
	"github.com/prometheus/common/expfmt"
 | 
						"github.com/prometheus/common/expfmt"
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
 | 
						"go.opentelemetry.io/otel/attribute"
 | 
				
			||||||
	"go.opentelemetry.io/otel/metric"
 | 
						"go.opentelemetry.io/otel/metric"
 | 
				
			||||||
	sdkresource "go.opentelemetry.io/otel/sdk/resource"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/component"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/collector/config/configtelemetry"
 | 
						"go.opentelemetry.io/collector/config/configtelemetry"
 | 
				
			||||||
	semconv "go.opentelemetry.io/collector/semconv/v1.18.0"
 | 
						semconv "go.opentelemetry.io/collector/semconv/v1.18.0"
 | 
				
			||||||
	"go.opentelemetry.io/collector/service/internal/promtest"
 | 
						"go.opentelemetry.io/collector/service/internal/promtest"
 | 
				
			||||||
	"go.opentelemetry.io/collector/service/internal/resource"
 | 
					 | 
				
			||||||
	"go.opentelemetry.io/collector/service/telemetry/internal/otelinit"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
| 
						 | 
					@ -44,7 +41,6 @@ func TestTelemetryInit(t *testing.T) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, tt := range []struct {
 | 
						for _, tt := range []struct {
 | 
				
			||||||
		name            string
 | 
							name            string
 | 
				
			||||||
		disableHighCard bool
 | 
					 | 
				
			||||||
		expectedMetrics map[string]metricValue
 | 
							expectedMetrics map[string]metricValue
 | 
				
			||||||
	}{
 | 
						}{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -87,42 +83,10 @@ func TestTelemetryInit(t *testing.T) {
 | 
				
			||||||
						"service_instance_id": testInstanceID,
 | 
											"service_instance_id": testInstanceID,
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
									"promhttp_metric_handler_errors_total": {
 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			name:            "DisableHighCardinalityWithOtel",
 | 
					 | 
				
			||||||
			disableHighCard: true,
 | 
					 | 
				
			||||||
			expectedMetrics: map[string]metricValue{
 | 
					 | 
				
			||||||
				metricPrefix + otelPrefix + counterName: {
 | 
					 | 
				
			||||||
					value: 13,
 | 
					 | 
				
			||||||
					labels: map[string]string{
 | 
					 | 
				
			||||||
						"service_name":        "otelcol",
 | 
					 | 
				
			||||||
						"service_version":     "latest",
 | 
					 | 
				
			||||||
						"service_instance_id": testInstanceID,
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
				metricPrefix + grpcPrefix + counterName: {
 | 
					 | 
				
			||||||
					value: 11,
 | 
					 | 
				
			||||||
					labels: map[string]string{
 | 
					 | 
				
			||||||
						"service_name":        "otelcol",
 | 
					 | 
				
			||||||
						"service_version":     "latest",
 | 
					 | 
				
			||||||
						"service_instance_id": testInstanceID,
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
				metricPrefix + httpPrefix + counterName: {
 | 
					 | 
				
			||||||
					value: 10,
 | 
					 | 
				
			||||||
					labels: map[string]string{
 | 
					 | 
				
			||||||
						"service_name":        "otelcol",
 | 
					 | 
				
			||||||
						"service_version":     "latest",
 | 
					 | 
				
			||||||
						"service_instance_id": testInstanceID,
 | 
					 | 
				
			||||||
					},
 | 
					 | 
				
			||||||
				},
 | 
					 | 
				
			||||||
				"target_info": {
 | 
					 | 
				
			||||||
					value: 0,
 | 
										value: 0,
 | 
				
			||||||
					labels: map[string]string{
 | 
										labels: map[string]string{
 | 
				
			||||||
						"service_name":        "otelcol",
 | 
											"cause": "encoding",
 | 
				
			||||||
						"service_version":     "latest",
 | 
					 | 
				
			||||||
						"service_instance_id": testInstanceID,
 | 
					 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
| 
						 | 
					@ -130,35 +94,36 @@ func TestTelemetryInit(t *testing.T) {
 | 
				
			||||||
	} {
 | 
						} {
 | 
				
			||||||
		prom := promtest.GetAvailableLocalAddressPrometheus(t)
 | 
							prom := promtest.GetAvailableLocalAddressPrometheus(t)
 | 
				
			||||||
		endpoint := fmt.Sprintf("http://%s:%d/metrics", *prom.Host, *prom.Port)
 | 
							endpoint := fmt.Sprintf("http://%s:%d/metrics", *prom.Host, *prom.Port)
 | 
				
			||||||
 | 
							cfg := Config{
 | 
				
			||||||
 | 
								Metrics: MetricsConfig{
 | 
				
			||||||
 | 
									Level: configtelemetry.LevelDetailed,
 | 
				
			||||||
 | 
									Readers: []config.MetricReader{{
 | 
				
			||||||
 | 
										Pull: &config.PullMetricReader{
 | 
				
			||||||
 | 
											Exporter: config.PullMetricExporter{Prometheus: prom},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									}},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		t.Run(tt.name, func(t *testing.T) {
 | 
							t.Run(tt.name, func(t *testing.T) {
 | 
				
			||||||
			cfg := &Config{
 | 
								sdk, err := config.NewSDK(
 | 
				
			||||||
				Metrics: MetricsConfig{
 | 
									config.WithContext(context.Background()),
 | 
				
			||||||
					Level: configtelemetry.LevelDetailed,
 | 
									config.WithOpenTelemetryConfiguration(config.OpenTelemetryConfiguration{
 | 
				
			||||||
					Readers: []config.MetricReader{{
 | 
										MeterProvider: &config.MeterProvider{
 | 
				
			||||||
						Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: prom}},
 | 
											Readers: cfg.Metrics.Readers,
 | 
				
			||||||
					}},
 | 
										},
 | 
				
			||||||
				},
 | 
										Resource: &config.Resource{
 | 
				
			||||||
				Traces: TracesConfig{
 | 
											SchemaUrl: ptr(""),
 | 
				
			||||||
					Processors: []config.SpanProcessor{
 | 
											Attributes: []config.AttributeNameValue{
 | 
				
			||||||
						{
 | 
												{Name: semconv.AttributeServiceInstanceID, Value: testInstanceID},
 | 
				
			||||||
							Batch: &config.BatchSpanProcessor{
 | 
												{Name: semconv.AttributeServiceName, Value: "otelcol"},
 | 
				
			||||||
								Exporter: config.SpanExporter{
 | 
												{Name: semconv.AttributeServiceVersion, Value: "latest"},
 | 
				
			||||||
									Console: config.Console{},
 | 
					 | 
				
			||||||
								},
 | 
					 | 
				
			||||||
							},
 | 
					 | 
				
			||||||
						},
 | 
											},
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
				},
 | 
									}),
 | 
				
			||||||
				Resource: map[string]*string{
 | 
								)
 | 
				
			||||||
					semconv.AttributeServiceInstanceID: &testInstanceID,
 | 
								require.NoError(t, err)
 | 
				
			||||||
				},
 | 
					
 | 
				
			||||||
			}
 | 
								mp, err := newMeterProvider(Settings{SDK: &sdk}, cfg)
 | 
				
			||||||
			set := meterProviderSettings{
 | 
					 | 
				
			||||||
				res:               resource.New(component.NewDefaultBuildInfo(), cfg.Resource),
 | 
					 | 
				
			||||||
				cfg:               cfg.Metrics,
 | 
					 | 
				
			||||||
				asyncErrorChannel: make(chan error),
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			mp, err := newMeterProvider(set, tt.disableHighCard)
 | 
					 | 
				
			||||||
			require.NoError(t, err)
 | 
								require.NoError(t, err)
 | 
				
			||||||
			defer func() {
 | 
								defer func() {
 | 
				
			||||||
				if prov, ok := mp.(interface{ Shutdown(context.Context) error }); ok {
 | 
									if prov, ok := mp.(interface{ Shutdown(context.Context) error }); ok {
 | 
				
			||||||
| 
						 | 
					@ -169,11 +134,14 @@ func TestTelemetryInit(t *testing.T) {
 | 
				
			||||||
			createTestMetrics(t, mp)
 | 
								createTestMetrics(t, mp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			metrics := getMetricsFromPrometheus(t, endpoint)
 | 
								metrics := getMetricsFromPrometheus(t, endpoint)
 | 
				
			||||||
			require.Equal(t, len(tt.expectedMetrics), len(metrics))
 | 
								require.Len(t, metrics, len(tt.expectedMetrics))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for metricName, metricValue := range tt.expectedMetrics {
 | 
								for metricName, metricValue := range tt.expectedMetrics {
 | 
				
			||||||
				mf, present := metrics[metricName]
 | 
									mf, present := metrics[metricName]
 | 
				
			||||||
				require.True(t, present, "expected metric %q was not present", metricName)
 | 
									require.True(t, present, "expected metric %q was not present", metricName)
 | 
				
			||||||
 | 
									if metricName == "promhttp_metric_handler_errors_total" {
 | 
				
			||||||
 | 
										continue
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				require.Len(t, mf.Metric, 1, "only one measure should exist for metric %q", metricName)
 | 
									require.Len(t, mf.Metric, 1, "only one measure should exist for metric %q", metricName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				labels := make(map[string]string)
 | 
									labels := make(map[string]string)
 | 
				
			||||||
| 
						 | 
					@ -194,13 +162,20 @@ func createTestMetrics(t *testing.T, mp metric.MeterProvider) {
 | 
				
			||||||
	require.NoError(t, err)
 | 
						require.NoError(t, err)
 | 
				
			||||||
	counter.Add(context.Background(), 13)
 | 
						counter.Add(context.Background(), 13)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	grpcExampleCounter, err := mp.Meter(otelinit.GRPCInstrumentation).Int64Counter(metricPrefix + grpcPrefix + counterName)
 | 
						grpcExampleCounter, err := mp.Meter("go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc").Int64Counter(metricPrefix + grpcPrefix + counterName)
 | 
				
			||||||
	require.NoError(t, err)
 | 
						require.NoError(t, err)
 | 
				
			||||||
	grpcExampleCounter.Add(context.Background(), 11, metric.WithAttributeSet(otelinit.GRPCUnacceptableKeyValues))
 | 
						grpcExampleCounter.Add(context.Background(), 11, metric.WithAttributeSet(attribute.NewSet(
 | 
				
			||||||
 | 
							attribute.String(semconv.AttributeNetSockPeerAddr, ""),
 | 
				
			||||||
 | 
							attribute.String(semconv.AttributeNetSockPeerPort, ""),
 | 
				
			||||||
 | 
							attribute.String(semconv.AttributeNetSockPeerName, ""),
 | 
				
			||||||
 | 
						)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	httpExampleCounter, err := mp.Meter(otelinit.HTTPInstrumentation).Int64Counter(metricPrefix + httpPrefix + counterName)
 | 
						httpExampleCounter, err := mp.Meter("go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp").Int64Counter(metricPrefix + httpPrefix + counterName)
 | 
				
			||||||
	require.NoError(t, err)
 | 
						require.NoError(t, err)
 | 
				
			||||||
	httpExampleCounter.Add(context.Background(), 10, metric.WithAttributeSet(otelinit.HTTPUnacceptableKeyValues))
 | 
						httpExampleCounter.Add(context.Background(), 10, metric.WithAttributeSet(attribute.NewSet(
 | 
				
			||||||
 | 
							attribute.String(semconv.AttributeNetHostName, ""),
 | 
				
			||||||
 | 
							attribute.String(semconv.AttributeNetHostPort, ""),
 | 
				
			||||||
 | 
						)))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getMetricsFromPrometheus(t *testing.T, endpoint string) map[string]*io_prometheus_client.MetricFamily {
 | 
					func getMetricsFromPrometheus(t *testing.T, endpoint string) map[string]*io_prometheus_client.MetricFamily {
 | 
				
			||||||
| 
						 | 
					@ -239,17 +214,32 @@ func getMetricsFromPrometheus(t *testing.T, endpoint string) map[string]*io_prom
 | 
				
			||||||
// See https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric/internal/x#readme-instrument-enabled.
 | 
					// See https://pkg.go.dev/go.opentelemetry.io/otel/sdk/metric/internal/x#readme-instrument-enabled.
 | 
				
			||||||
func TestInstrumentEnabled(t *testing.T) {
 | 
					func TestInstrumentEnabled(t *testing.T) {
 | 
				
			||||||
	prom := promtest.GetAvailableLocalAddressPrometheus(t)
 | 
						prom := promtest.GetAvailableLocalAddressPrometheus(t)
 | 
				
			||||||
	set := meterProviderSettings{
 | 
						cfg := Config{
 | 
				
			||||||
		res: sdkresource.Default(),
 | 
							Metrics: MetricsConfig{
 | 
				
			||||||
		cfg: MetricsConfig{
 | 
					 | 
				
			||||||
			Level: configtelemetry.LevelDetailed,
 | 
								Level: configtelemetry.LevelDetailed,
 | 
				
			||||||
			Readers: []config.MetricReader{{
 | 
								Readers: []config.MetricReader{{
 | 
				
			||||||
				Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: prom}},
 | 
									Pull: &config.PullMetricReader{Exporter: config.PullMetricExporter{Prometheus: prom}},
 | 
				
			||||||
			}},
 | 
								}},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		asyncErrorChannel: make(chan error),
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	meterProvider, err := newMeterProvider(set, false)
 | 
						sdk, err := config.NewSDK(
 | 
				
			||||||
 | 
							config.WithContext(context.Background()),
 | 
				
			||||||
 | 
							config.WithOpenTelemetryConfiguration(config.OpenTelemetryConfiguration{
 | 
				
			||||||
 | 
								MeterProvider: &config.MeterProvider{
 | 
				
			||||||
 | 
									Readers: cfg.Metrics.Readers,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								Resource: &config.Resource{
 | 
				
			||||||
 | 
									SchemaUrl: ptr(""),
 | 
				
			||||||
 | 
									Attributes: []config.AttributeNameValue{
 | 
				
			||||||
 | 
										{Name: semconv.AttributeServiceInstanceID, Value: testInstanceID},
 | 
				
			||||||
 | 
										{Name: semconv.AttributeServiceName, Value: "otelcol"},
 | 
				
			||||||
 | 
										{Name: semconv.AttributeServiceVersion, Value: "latest"},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							}),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
						meterProvider, err := newMeterProvider(Settings{SDK: &sdk}, cfg)
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		if prov, ok := meterProvider.(interface{ Shutdown(context.Context) error }); ok {
 | 
							if prov, ok := meterProvider.(interface{ Shutdown(context.Context) error }); ok {
 | 
				
			||||||
			require.NoError(t, prov.Shutdown(context.Background()))
 | 
								require.NoError(t, prov.Shutdown(context.Background()))
 | 
				
			||||||
| 
						 | 
					@ -301,3 +291,7 @@ func TestInstrumentEnabled(t *testing.T) {
 | 
				
			||||||
	_, ok = floatGauge.(enabledInstrument)
 | 
						_, ok = floatGauge.(enabledInstrument)
 | 
				
			||||||
	assert.True(t, ok, "Float64Gauge does not implement the experimental 'Enabled' method")
 | 
						assert.True(t, ok, "Float64Gauge does not implement the experimental 'Enabled' method")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ptr[T any](v T) *T {
 | 
				
			||||||
 | 
						return &v
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ import (
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
	"go.opentelemetry.io/contrib/config"
 | 
						config "go.opentelemetry.io/contrib/config/v0.3.0"
 | 
				
			||||||
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
 | 
						sdktrace "go.opentelemetry.io/otel/sdk/trace"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.opentelemetry.io/collector/config/configtelemetry"
 | 
						"go.opentelemetry.io/collector/config/configtelemetry"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue