From 73fb994c77db998a7f5e3414dd6d3b11f89bf57d Mon Sep 17 00:00:00 2001 From: David Ashpole Date: Tue, 27 Sep 2022 13:24:15 +0000 Subject: [PATCH] update to the latest otel-go release --- Makefile | 8 +- e2e-test-server/go.mod | 24 +- e2e-test-server/go.sum | 47 +- example/metric/example.go | 41 +- example/metric/go.mod | 12 +- example/metric/go.sum | 30 +- example/trace/http/go.mod | 10 +- example/trace/http/go.sum | 20 +- exporter/collector/go.mod | 6 +- exporter/collector/go.sum | 16 +- exporter/collector/integrationtest/go.mod | 8 +- exporter/collector/integrationtest/go.sum | 18 +- .../traces/traces_basic_expected.json | 40 +- exporter/metric/README.md | 2 +- exporter/metric/cloudmonitoring.go | 79 ++- exporter/metric/error.go | 22 +- exporter/metric/go.mod | 25 +- exporter/metric/go.sum | 32 +- exporter/metric/metric.go | 462 ++++++++---------- exporter/metric/metric_test.go | 242 +++------ exporter/metric/option.go | 19 +- exporter/trace/go.mod | 10 +- exporter/trace/go.sum | 20 +- go.mod | 4 +- go.sum | 8 +- internal/resourcemapping/go.mod | 4 +- internal/resourcemapping/go.sum | 8 +- 27 files changed, 524 insertions(+), 693 deletions(-) diff --git a/Makefile b/Makefile index 49bea3886..b6578aa2d 100644 --- a/Makefile +++ b/Makefile @@ -178,10 +178,10 @@ gotidy: update-dep: $(MAKE) for-all-mod CMD="$(PWD)/internal/buildscripts/update-dep" -STABLE_OTEL_VERSION=v1.9.0 -UNSTABLE_OTEL_VERSION=v0.31.0 -UNSTABLE_CONTRIB_OTEL_VERSION=v0.34.0 -STABLE_CONTRIB_OTEL_VERSION=v1.9.0 +STABLE_OTEL_VERSION=v1.10.0 +UNSTABLE_OTEL_VERSION=v0.32.1 +UNSTABLE_CONTRIB_OTEL_VERSION=v0.36.0 +STABLE_CONTRIB_OTEL_VERSION=v1.10.0 COLLECTOR_VERSION=v0.60.0 .PHONY: update-otel diff --git a/e2e-test-server/go.mod b/e2e-test-server/go.mod index 34bdabe88..8303548cd 100644 --- a/e2e-test-server/go.mod +++ b/e2e-test-server/go.mod @@ -6,17 +6,17 @@ require ( cloud.google.com/go/iam v0.3.0 // indirect cloud.google.com/go/pubsub v1.19.0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.8.8 - go.opentelemetry.io/otel v1.9.0 - go.opentelemetry.io/otel/sdk v1.9.0 - go.opentelemetry.io/otel/trace v1.9.0 + go.opentelemetry.io/otel v1.10.0 + go.opentelemetry.io/otel/sdk v1.10.0 + go.opentelemetry.io/otel/trace v1.10.0 google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf ) -require go.opentelemetry.io/contrib/detectors/gcp v1.9.0 +require go.opentelemetry.io/contrib/detectors/gcp v1.10.0 require ( - cloud.google.com/go v0.102.0 // indirect - cloud.google.com/go/compute v1.7.0 // indirect + cloud.google.com/go v0.102.1 // indirect + cloud.google.com/go/compute v1.9.0 // indirect cloud.google.com/go/trace v1.2.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v0.32.8 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.32.8 // indirect @@ -24,18 +24,18 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect github.com/googleapis/gax-go/v2 v2.4.0 // indirect go.opencensus.io v0.23.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.8.0 // indirect - golang.org/x/net v0.0.0-20220607020251-c690dde0001d // indirect - golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb // indirect + golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect + golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 // indirect golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect - golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d // indirect + golang.org/x/sys v0.0.0-20220624220833-87e55d714810 // indirect golang.org/x/text v0.3.7 // indirect - google.golang.org/api v0.84.0 // indirect + google.golang.org/api v0.91.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/grpc v1.49.0 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/e2e-test-server/go.sum b/e2e-test-server/go.sum index 7cc952665..a73c6e9e4 100644 --- a/e2e-test-server/go.sum +++ b/e2e-test-server/go.sum @@ -28,8 +28,9 @@ cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Ud cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0 h1:DAq3r8y4mDgyB/ZPJ9v/5VJNqjgJAxTn6ZYLlUywOu8= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1 h1:vpK6iQWv/2uUeFJth4/cBHsQAGjn1iIE6AAlxipRaA0= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -41,8 +42,9 @@ cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJW cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.9.0 h1:ED/FP4xv8GJw63v556/ASNc1CeeLUO2Bs8nzaHchkHg= +cloud.google.com/go/compute v1.9.0/go.mod h1:lWv1h/zUWTm/LozzfTJhBSkd6ShQq8la8VeeuOEGxfY= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= @@ -157,8 +159,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -179,8 +182,10 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa h1:7MYGT2XEMam7Mtzv1yDUYXANedWvwk3HKkR3MyGowy8= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0 h1:zO8WHNx/MYiAKJ3d5spxZXZE6KHmIQGQcAzwUzV7qQw= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -227,16 +232,16 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib/detectors/gcp v1.9.0 h1:en6EnI47A3nrVtKCIgwFS5SUAhYW8LHn4Rkmm6HGhzg= -go.opentelemetry.io/contrib/detectors/gcp v1.9.0/go.mod h1:OqG0FEnmWeJWYVrEovaHXHXY4bVTnp/WfTzhwrsGWlw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0 h1:9NkMW03wwEzPtP/KciZ4Ozu/Uz5ZA7kfqXJIObnrjGU= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= -go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/contrib/detectors/gcp v1.10.0 h1:p9iyGXF6+zaRI9bmqjqXCZ0yyBPUooJdTOouoZ1ho8E= +go.opentelemetry.io/contrib/detectors/gcp v1.10.0/go.mod h1:AM4R9y2N8RMf8QasmDzj6pG0Z/J4Jmk8HooOuEo1iFU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 h1:qZ3KzA4qPzLBDtQyPk4ydjlg8zvXbNysnFHaVMKJbVo= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/metric v0.32.1 h1:ftff5LSBCIDwL0UkhBuDg8j9NNxx2IusvJ18q9h6RC4= +go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -322,8 +327,9 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -343,8 +349,9 @@ golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb h1:8tDJ3aechhddbdPAxpycgXHJRMLpk/Ab+aa4OgdN5/g= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 h1:+jnHzr9VPj32ykQVai5DNahi9+NSp7yYuCsl5eAQtL0= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -416,8 +423,9 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d h1:Zu/JngovGLVi6t2J3nmAf3AoTDwuzw85YZ3b9o4yU7s= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810 h1:rHZQSjJdAI4Xf5Qzeh2bBc5YJIkPFVM6oDtMFYmgws0= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -531,8 +539,9 @@ google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRR google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0 h1:NMB9J4cCxs9xEm+1Z9QiO3eFvn7EnQj3Eo3hN6ugVlg= google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.91.0 h1:731+JzuwaJoZXRQGmPoBiV+SrsAfUaIkdMCWTcQNPyA= +google.golang.org/api v0.91.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -621,6 +630,8 @@ google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf h1:Q5xNKbTSFwkuaaGaR7CMcXEM5sy19KYdUU8iF8/iRC0= google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= diff --git a/example/metric/example.go b/example/metric/example.go index ea8ce768b..d742e899c 100644 --- a/example/metric/example.go +++ b/example/metric/example.go @@ -25,9 +25,7 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric/instrument" - "go.opentelemetry.io/otel/sdk/metric/controller/basic" - "go.opentelemetry.io/otel/sdk/resource" - semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "go.opentelemetry.io/otel/sdk/metric" ) type observedFloat struct { @@ -57,26 +55,24 @@ func main() { // Initialization. In order to pass the credentials to the exporter, // prepare credential file following the instruction described in this doc. // https://pkg.go.dev/golang.org/x/oauth2/google?tab=doc#FindDefaultCredentials - opts := []mexporter.Option{} - - // NOTE: In current implementation of exporter, this resource is ignored because - // the function to handle the common resource just ignore the passed resource and - // it returned hard coded "global" resource. - // This should be fixed in #29. - resOpt := basic.WithResource(resource.NewWithAttributes( - semconv.SchemaURL, - attribute.String("instance_id", "abc123"), - attribute.String("application", "example-app"), - )) - pusher, err := mexporter.InstallNewPipeline(opts, resOpt) + exporter, err := mexporter.New() if err != nil { - log.Fatalf("Failed to establish pipeline: %v", err) + log.Fatalf("Failed to create exporter: %v", err) } + + // initialize a MeterProvider with that periodically exports to the GCP exporter. + provider := metric.NewMeterProvider( + metric.WithReader(metric.NewPeriodicReader(exporter)), + ) ctx := context.Background() - defer pusher.Stop(ctx) + defer func() { + if err = provider.Shutdown(ctx); err != nil { + log.Fatalf("failed to shutdown meter provider: %v", err) + } + }() - // Start meter - meter := pusher.Meter("cloudmonitoring/example") + // Create a meter with which we will record metrics for our package. + meter := provider.Meter("github.com/GoogleCloudPlatform/opentelemetry-operations-go/example/metric") // Register counter value counter, err := meter.SyncInt64().Counter("counter-a") @@ -100,12 +96,15 @@ func main() { gaugeObserver, err := meter.AsyncFloat64().Gauge("observer-a") if err != nil { - log.Panicf("failed to initialize instrument: %v", err) + log.Fatalf("failed to initialize instrument: %v", err) } - _ = meter.RegisterCallback([]instrument.Asynchronous{gaugeObserver}, func(ctx context.Context) { + err = meter.RegisterCallback([]instrument.Asynchronous{gaugeObserver}, func(ctx context.Context) { v := of.get() gaugeObserver.Observe(ctx, v, olabels...) }) + if err != nil { + log.Fatalf("failed to register callback: %v", err) + } // Add measurement once an every 10 second. timer := time.NewTicker(10 * time.Second) diff --git a/example/metric/go.mod b/example/metric/go.mod index 4d328c578..8b40216c2 100644 --- a/example/metric/go.mod +++ b/example/metric/go.mod @@ -8,10 +8,9 @@ replace github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/clou require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.32.8 - go.opentelemetry.io/otel v1.9.0 - go.opentelemetry.io/otel/metric v0.31.0 - go.opentelemetry.io/otel/sdk v1.9.0 - go.opentelemetry.io/otel/sdk/metric v0.31.0 + go.opentelemetry.io/otel v1.10.0 + go.opentelemetry.io/otel/metric v0.32.1 + go.opentelemetry.io/otel/sdk/metric v0.32.1 ) require ( @@ -24,7 +23,10 @@ require ( github.com/google/go-cmp v0.5.8 // indirect github.com/googleapis/gax-go/v2 v2.2.0 // indirect go.opencensus.io v0.23.0 // indirect - go.opentelemetry.io/otel/trace v1.9.0 // indirect + go.opentelemetry.io/otel/sdk v1.10.0 // indirect + go.opentelemetry.io/otel/trace v1.10.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.8.0 // indirect golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a // indirect golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 // indirect diff --git a/example/metric/go.sum b/example/metric/go.sum index 382b43dae..7844df496 100644 --- a/example/metric/go.sum +++ b/example/metric/go.sum @@ -55,7 +55,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -73,6 +72,7 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -186,6 +186,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -204,17 +205,21 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= -go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/sdk/metric v0.31.0 h1:2sZx4R43ZMhJdteKAlKoHvRgrMp53V1aRxvEf5lCq8Q= -go.opentelemetry.io/otel/sdk/metric v0.31.0/go.mod h1:fl0SmNnX9mN9xgU6OLYLMBMrNAsaZQi7qBwprwO3abk= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/metric v0.32.1 h1:ftff5LSBCIDwL0UkhBuDg8j9NNxx2IusvJ18q9h6RC4= +go.opentelemetry.io/otel/metric v0.32.1/go.mod h1:iLPP7FaKMAD5BIxJ2VX7f2KTuz//0QK2hEUyti5psqQ= +go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/sdk/metric v0.32.1 h1:S6AqzulzGQl+sTpYeAoVLw1SJbc2LYuKCMUmfEKG+zM= +go.opentelemetry.io/otel/sdk/metric v0.32.1/go.mod h1:Nn+Nt/7cKzm5ISmvLzNO5RLf0Xuv8/Qo8fkpr0JDOzs= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -612,8 +617,9 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/example/trace/http/go.mod b/example/trace/http/go.mod index 630e44a97..5e008ce81 100644 --- a/example/trace/http/go.mod +++ b/example/trace/http/go.mod @@ -13,10 +13,10 @@ replace github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/clou require ( github.com/GoogleCloudPlatform/opentelemetry-operations-go v0.32.8 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.8.8 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0 - go.opentelemetry.io/otel v1.9.0 - go.opentelemetry.io/otel/sdk v1.9.0 - go.opentelemetry.io/otel/trace v1.9.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 + go.opentelemetry.io/otel v1.10.0 + go.opentelemetry.io/otel/sdk v1.10.0 + go.opentelemetry.io/otel/trace v1.10.0 ) require ( @@ -31,7 +31,7 @@ require ( github.com/google/go-cmp v0.5.8 // indirect github.com/googleapis/gax-go/v2 v2.2.0 // indirect go.opencensus.io v0.23.0 // indirect - go.opentelemetry.io/otel/metric v0.31.0 // indirect + go.opentelemetry.io/otel/metric v0.32.1 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect diff --git a/example/trace/http/go.sum b/example/trace/http/go.sum index 338eb3ea3..fcb36b7d5 100644 --- a/example/trace/http/go.sum +++ b/example/trace/http/go.sum @@ -208,16 +208,16 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0 h1:9NkMW03wwEzPtP/KciZ4Ozu/Uz5ZA7kfqXJIObnrjGU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0/go.mod h1:548ZsYzmT4PL4zWKRd8q/N4z0Wxzn/ZxUE+lkEpwWQA= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= -go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 h1:qZ3KzA4qPzLBDtQyPk4ydjlg8zvXbNysnFHaVMKJbVo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0/go.mod h1:14Oo79mRwusSI02L0EfG3Gp1uF3+1wSL+D4zDysxyqs= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/metric v0.32.1 h1:ftff5LSBCIDwL0UkhBuDg8j9NNxx2IusvJ18q9h6RC4= +go.opentelemetry.io/otel/metric v0.32.1/go.mod h1:iLPP7FaKMAD5BIxJ2VX7f2KTuz//0QK2hEUyti5psqQ= +go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= diff --git a/exporter/collector/go.mod b/exporter/collector/go.mod index ad5ccde25..ce5d4a53f 100644 --- a/exporter/collector/go.mod +++ b/exporter/collector/go.mod @@ -14,9 +14,9 @@ require ( go.opencensus.io v0.23.0 go.opentelemetry.io/collector/pdata v0.60.0 go.opentelemetry.io/collector/semconv v0.60.0 - go.opentelemetry.io/otel v1.9.0 - go.opentelemetry.io/otel/sdk v1.9.0 - go.opentelemetry.io/otel/trace v1.9.0 + go.opentelemetry.io/otel v1.10.0 + go.opentelemetry.io/otel/sdk v1.10.0 + go.opentelemetry.io/otel/trace v1.10.0 go.uber.org/atomic v1.9.0 go.uber.org/multierr v1.8.0 go.uber.org/zap v1.21.0 diff --git a/exporter/collector/go.sum b/exporter/collector/go.sum index 97439d10d..7f47bb93a 100644 --- a/exporter/collector/go.sum +++ b/exporter/collector/go.sum @@ -244,14 +244,14 @@ go.opentelemetry.io/collector/pdata v0.60.0 h1:jCNR5jtUom2FcUu30h4tw7enZytwGnXX6 go.opentelemetry.io/collector/pdata v0.60.0/go.mod h1:0hqgNMRneVXaLNelv3q0XKJbyBW9aMDwyC15pKd30+E= go.opentelemetry.io/collector/semconv v0.60.0 h1:xy6HSukzA5CC8SR4DvFyLd28EFEOnQgxtpU1bSCM0qY= go.opentelemetry.io/collector/semconv v0.60.0/go.mod h1:aRkHuJ/OshtDFYluKEtnG5nkKTsy1HZuvZVHmakx+Vo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0 h1:9NkMW03wwEzPtP/KciZ4Ozu/Uz5ZA7kfqXJIObnrjGU= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= -go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 h1:qZ3KzA4qPzLBDtQyPk4ydjlg8zvXbNysnFHaVMKJbVo= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/metric v0.32.1 h1:ftff5LSBCIDwL0UkhBuDg8j9NNxx2IusvJ18q9h6RC4= +go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= diff --git a/exporter/collector/integrationtest/go.mod b/exporter/collector/integrationtest/go.mod index f10b4267b..8a45aa7f7 100644 --- a/exporter/collector/integrationtest/go.mod +++ b/exporter/collector/integrationtest/go.mod @@ -46,10 +46,10 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.opentelemetry.io/collector/semconv v0.60.0 // indirect - go.opentelemetry.io/otel v1.9.0 // indirect - go.opentelemetry.io/otel/metric v0.31.0 // indirect - go.opentelemetry.io/otel/sdk v1.9.0 // indirect - go.opentelemetry.io/otel/trace v1.9.0 // indirect + go.opentelemetry.io/otel v1.10.0 // indirect + go.opentelemetry.io/otel/metric v0.32.1 // indirect + go.opentelemetry.io/otel/sdk v1.10.0 // indirect + go.opentelemetry.io/otel/trace v1.10.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect diff --git a/exporter/collector/integrationtest/go.sum b/exporter/collector/integrationtest/go.sum index 7c3c4f7f5..48d7108f0 100644 --- a/exporter/collector/integrationtest/go.sum +++ b/exporter/collector/integrationtest/go.sum @@ -413,15 +413,15 @@ go.opentelemetry.io/collector/pdata v0.60.0 h1:jCNR5jtUom2FcUu30h4tw7enZytwGnXX6 go.opentelemetry.io/collector/pdata v0.60.0/go.mod h1:0hqgNMRneVXaLNelv3q0XKJbyBW9aMDwyC15pKd30+E= go.opentelemetry.io/collector/semconv v0.60.0 h1:xy6HSukzA5CC8SR4DvFyLd28EFEOnQgxtpU1bSCM0qY= go.opentelemetry.io/collector/semconv v0.60.0/go.mod h1:aRkHuJ/OshtDFYluKEtnG5nkKTsy1HZuvZVHmakx+Vo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0 h1:9NkMW03wwEzPtP/KciZ4Ozu/Uz5ZA7kfqXJIObnrjGU= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= -go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 h1:qZ3KzA4qPzLBDtQyPk4ydjlg8zvXbNysnFHaVMKJbVo= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/metric v0.32.1 h1:ftff5LSBCIDwL0UkhBuDg8j9NNxx2IusvJ18q9h6RC4= +go.opentelemetry.io/otel/metric v0.32.1/go.mod h1:iLPP7FaKMAD5BIxJ2VX7f2KTuz//0QK2hEUyti5psqQ= +go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= diff --git a/exporter/collector/integrationtest/testdata/fixtures/traces/traces_basic_expected.json b/exporter/collector/integrationtest/testdata/fixtures/traces/traces_basic_expected.json index 9bed315e4..f71b2be5e 100644 --- a/exporter/collector/integrationtest/testdata/fixtures/traces/traces_basic_expected.json +++ b/exporter/collector/integrationtest/testdata/fixtures/traces/traces_basic_expected.json @@ -44,7 +44,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -223,7 +223,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -402,7 +402,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -581,7 +581,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -745,7 +745,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -875,7 +875,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -1005,7 +1005,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -1135,7 +1135,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -1251,7 +1251,7 @@ "attributeMap": { "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -1347,7 +1347,7 @@ "attributeMap": { "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -1443,7 +1443,7 @@ "attributeMap": { "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -1539,7 +1539,7 @@ "attributeMap": { "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -1664,7 +1664,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -1843,7 +1843,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -2022,7 +2022,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -2186,7 +2186,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -2316,7 +2316,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -2446,7 +2446,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -2576,7 +2576,7 @@ }, "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { @@ -2692,7 +2692,7 @@ "attributeMap": { "g.co/agent": { "stringValue": { - "value": "opentelemetry-go 1.9.0; google-cloud-trace-exporter 1.8.8" + "value": "opentelemetry-go 1.10.0; google-cloud-trace-exporter 1.8.8" } }, "g.co/gae/app/module": { diff --git a/exporter/metric/README.md b/exporter/metric/README.md index 0005b6841..9d66af4b5 100644 --- a/exporter/metric/README.md +++ b/exporter/metric/README.md @@ -15,13 +15,13 @@ Google Cloud Monitoring is a managed service provided by Google Cloud Platform. After you import the metric exporter package, then register the exporter to the application, and start sending metrics. If you are running in a GCP environment, the exporter will automatically authenticate using the environment's service account. If not, you will need to follow the instructions in [Authentication](#Authentication). +// TODO update! ```go package main import ( "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/label" - "go.opentelemetry.io/otel/sdk/metric/controller/basic" "go.opentelemetry.io/otel/sdk/resource" mexporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric" diff --git a/exporter/metric/cloudmonitoring.go b/exporter/metric/cloudmonitoring.go index cac5b7c96..895473aa2 100644 --- a/exporter/metric/cloudmonitoring.go +++ b/exporter/metric/cloudmonitoring.go @@ -18,39 +18,17 @@ import ( "context" "errors" "fmt" - "time" - "go.opentelemetry.io/otel/sdk/metric/export" - "go.opentelemetry.io/otel/sdk/metric/export/aggregation" - "go.opentelemetry.io/otel/sdk/metric/sdkapi" - "go.opentelemetry.io/otel/sdk/resource" + metricapi "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/global" + "go.opentelemetry.io/otel/sdk/metric" monitoring "cloud.google.com/go/monitoring/apiv3/v2" "golang.org/x/oauth2/google" ) -const ( - // defaultReportingDuration defaults to 60 seconds. - defaultReportingDuration = 60 * time.Second - - // minimumReportingDuration is the minimum duration supported by Google Cloud Monitoring. - // As of Apr 2020, the minimum duration is 10 second for custom metrics. - // https://cloud.google.com/monitoring/custom-metrics/creating-metrics#writing-ts - minimumReportingDuration = 10 * time.Second -) - -var ( - errReportingIntervalTooLow = fmt.Errorf("reporting interval less than %s", minimumReportingDuration) -) - -// Exporter is the public interface of OpenTelemetry metric exporter for -// Google Cloud Monitoring. -type Exporter struct { - metricExporter *metricExporter -} - -// NewRawExporter creates a new Exporter thats implements metric.Exporter. -func NewRawExporter(opts ...Option) (*Exporter, error) { +// New creates a new Exporter thats implements metric.Exporter. +func New(opts ...Option) (metric.Exporter, error) { o := options{context: context.Background()} for _, opt := range opts { opt(&o) @@ -59,35 +37,42 @@ func NewRawExporter(opts ...Option) (*Exporter, error) { if o.projectID == "" { creds, err := google.FindDefaultCredentials(o.context, monitoring.DefaultAuthScopes()...) if err != nil { - return nil, fmt.Errorf("Failed to find Google Cloud credentials: %v", err) + return nil, fmt.Errorf("failed to find Google Cloud credentials: %v", err) } if creds.ProjectID == "" { - return nil, errors.New("Google Cloud Monitoring: no project found with application default credentials") + return nil, errors.New("google cloud monitoring: no project found with application default credentials") } o.projectID = creds.ProjectID } - if o.reportingInterval == 0 { - o.reportingInterval = defaultReportingDuration - } - if o.reportingInterval < minimumReportingDuration { - return nil, errReportingIntervalTooLow - } + return newMetricExporter(&o) +} - me, err := newMetricExporter(&o) +// NewRawExporter creates a new Exporter thats implements metric.Exporter. +// Deprecated: Use New() instead. +func NewRawExporter(opts ...Option) (metric.Exporter, error) { + return New(opts...) +} + +// InstallNewPipeline creates a fully-configured MeterProvider which exports to cloud monitoring. +// Deprecated: Use New() instead and metric.NewMeterProvider instead. +func NewExportPipeline(opts []Option, popts ...metric.Option) (metricapi.MeterProvider, error) { + exporter, err := New(opts...) if err != nil { return nil, err } - return &Exporter{ - metricExporter: me, - }, nil + popts = append(popts, metric.WithReader(metric.NewPeriodicReader(exporter))) + provider := metric.NewMeterProvider(popts...) + return provider, nil } -// Export exports the provide metric record to Google Cloud Monitoring. -func (e *Exporter) Export(ctx context.Context, res *resource.Resource, ilr export.InstrumentationLibraryReader) error { - return e.metricExporter.ExportMetrics(ctx, res, ilr) -} - -// TemporalityFor returns cumulative temporality -func (e *Exporter) TemporalityFor(*sdkapi.Descriptor, aggregation.Kind) aggregation.Temporality { - return aggregation.CumulativeTemporality +// InstallNewPipeline creates a fully-configured MeterProvider which exports to cloud monitoring, +// and sets it as the global MeterProvider +// Deprecated: Use New(), metric.NewMeterProvider, and global.SetMeterProvider instead. +func InstallNewPipeline(opts []Option, popts ...metric.Option) (metricapi.MeterProvider, error) { + provider, err := NewExportPipeline(opts, popts...) + if err != nil { + return nil, err + } + global.SetMeterProvider(provider) + return provider, nil } diff --git a/exporter/metric/error.go b/exporter/metric/error.go index a9299c2e7..974c0af95 100644 --- a/exporter/metric/error.go +++ b/exporter/metric/error.go @@ -17,34 +17,14 @@ package metric import ( "errors" "fmt" - - "go.opentelemetry.io/otel/sdk/metric/export/aggregation" - "go.opentelemetry.io/otel/sdk/metric/number" - "go.opentelemetry.io/otel/sdk/metric/sdkapi" ) var ( errBlankProjectID = errors.New("expecting a non-blank ProjectID") ) -type errUnsupportedAggregation struct { - agg aggregation.Aggregation -} - -func (e errUnsupportedAggregation) Error() string { - return fmt.Sprintf("currently the aggregator is not supported: %v", e.agg) -} - -type errUnexpectedNumberKind struct { - kind number.Kind -} - -func (e errUnexpectedNumberKind) Error() string { - return fmt.Sprintf("the number kind is unexpected: %v", e.kind) -} - type errUnexpectedAggregationKind struct { - kind sdkapi.InstrumentKind + kind string } func (e errUnexpectedAggregationKind) Error() string { diff --git a/exporter/metric/go.mod b/exporter/metric/go.mod index 4c03d4918..4f145455d 100644 --- a/exporter/metric/go.mod +++ b/exporter/metric/go.mod @@ -1,16 +1,14 @@ module github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric -go 1.17 +go 1.18 require ( cloud.google.com/go/monitoring v1.4.0 - github.com/davecgh/go-spew v1.1.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/stretchr/testify v1.7.1 - go.opentelemetry.io/otel v1.9.0 - go.opentelemetry.io/otel/metric v0.31.0 - go.opentelemetry.io/otel/sdk v1.9.0 - go.opentelemetry.io/otel/sdk/metric v0.31.0 + go.opentelemetry.io/otel v1.10.0 + go.opentelemetry.io/otel/metric v0.32.1 + go.opentelemetry.io/otel/sdk v1.10.0 + go.opentelemetry.io/otel/sdk/metric v0.32.1 golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 // indirect @@ -18,13 +16,17 @@ require ( google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf google.golang.org/grpc v1.49.0 google.golang.org/protobuf v1.28.1 - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect ) -require github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.32.8 +require ( + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.0.0-00010101000000-000000000000 + github.com/stretchr/testify v1.7.1 + go.uber.org/multierr v1.8.0 +) require ( cloud.google.com/go/compute v1.5.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/protobuf v1.5.2 // indirect @@ -32,10 +34,11 @@ require ( github.com/googleapis/gax-go/v2 v2.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.opencensus.io v0.23.0 // indirect - go.opentelemetry.io/otel/trace v1.9.0 // indirect + go.opentelemetry.io/otel/trace v1.10.0 // indirect + go.uber.org/atomic v1.7.0 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/appengine v1.6.7 // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) replace github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock => ../../internal/cloudmock diff --git a/exporter/metric/go.sum b/exporter/metric/go.sum index 8992cd87f..04093730f 100644 --- a/exporter/metric/go.sum +++ b/exporter/metric/go.sum @@ -55,7 +55,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -189,6 +188,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -208,17 +208,21 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= -go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/sdk/metric v0.31.0 h1:2sZx4R43ZMhJdteKAlKoHvRgrMp53V1aRxvEf5lCq8Q= -go.opentelemetry.io/otel/sdk/metric v0.31.0/go.mod h1:fl0SmNnX9mN9xgU6OLYLMBMrNAsaZQi7qBwprwO3abk= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/metric v0.32.1 h1:ftff5LSBCIDwL0UkhBuDg8j9NNxx2IusvJ18q9h6RC4= +go.opentelemetry.io/otel/metric v0.32.1/go.mod h1:iLPP7FaKMAD5BIxJ2VX7f2KTuz//0QK2hEUyti5psqQ= +go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/sdk/metric v0.32.1 h1:S6AqzulzGQl+sTpYeAoVLw1SJbc2LYuKCMUmfEKG+zM= +go.opentelemetry.io/otel/sdk/metric v0.32.1/go.mod h1:Nn+Nt/7cKzm5ISmvLzNO5RLf0Xuv8/Qo8fkpr0JDOzs= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -612,14 +616,14 @@ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/exporter/metric/metric.go b/exporter/metric/metric.go index 7476f21f1..689e3da98 100644 --- a/exporter/metric/metric.go +++ b/exporter/metric/metric.go @@ -19,21 +19,17 @@ import ( "fmt" "log" "math" + "reflect" "strings" "time" - "go.opentelemetry.io/otel/metric/global" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/instrumentation" - controller "go.opentelemetry.io/otel/sdk/metric/controller/basic" - "go.opentelemetry.io/otel/sdk/metric/export" - "go.opentelemetry.io/otel/sdk/metric/export/aggregation" - "go.opentelemetry.io/otel/sdk/metric/number" - processor "go.opentelemetry.io/otel/sdk/metric/processor/basic" - "go.opentelemetry.io/otel/sdk/metric/sdkapi" - "go.opentelemetry.io/otel/sdk/metric/selector/simple" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "go.opentelemetry.io/otel/sdk/resource" monitoring "cloud.google.com/go/monitoring/apiv3/v2" + "go.uber.org/multierr" "google.golang.org/api/option" "google.golang.org/genproto/googleapis/api/distribution" googlemetricpb "google.golang.org/genproto/googleapis/api/metric" @@ -52,9 +48,9 @@ type key struct { libraryname string } -func keyOf(descriptor *sdkapi.Descriptor, library instrumentation.Library) key { +func keyOf(metrics metricdata.Metrics, library instrumentation.Library) key { return key{ - name: descriptor.Name(), + name: metrics.Name, libraryname: library.Name, } } @@ -69,11 +65,14 @@ type metricExporter struct { mdCache map[key]*googlemetricpb.MetricDescriptor client *monitoring.MetricClient +} + +// ForceFlush does nothing, the exporter holds no state. +func (e *metricExporter) ForceFlush(ctx context.Context) error { return ctx.Err() } - // startTime is the cache of start time shared among all CUMULATIVE values. - // c.f. https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricKind - // TODO: Remove this when OTel SDK provides start time for each record specifically for stateful batcher. - startTime time.Time +// Shutdown shuts down the client connections +func (e *metricExporter) Shutdown(ctx context.Context) error { + return multierr.Combine(ctx.Err(), e.client.Close()) } // Below are maps with monitored resources fields as keys @@ -140,53 +139,20 @@ func newMetricExporter(o *options) (*metricExporter, error) { cache := map[key]*googlemetricpb.MetricDescriptor{} e := &metricExporter{ - o: o, - mdCache: cache, - client: client, - startTime: time.Now(), + o: o, + mdCache: cache, + client: client, } return e, nil } -// InstallNewPipeline instantiates a NewExportPipeline and registers it globally. -func InstallNewPipeline(opts []Option, popts ...controller.Option) (*controller.Controller, error) { - pusher, err := NewExportPipeline(opts, popts...) - if err != nil { - return nil, err - } - global.SetMeterProvider(pusher) - return pusher, err -} - -// NewExportPipeline sets up a complete export pipeline with the recommended setup, -// chaining a NewRawExporter into the recommended selectors and integrators. -func NewExportPipeline(opts []Option, popts ...controller.Option) (*controller.Controller, error) { - selector := simple.NewWithHistogramDistribution() - exporter, err := NewRawExporter(opts...) - if err != nil { - return nil, err - } - period := exporter.metricExporter.o.reportingInterval - checkpointer := processor.NewFactory(selector, exporter) - - pusher := controller.New( - checkpointer, - append([]controller.Option{ - controller.WithExporter(exporter), - controller.WithCollectPeriod(period), - }, popts...)..., - ) - pusher.Start(context.Background()) - return pusher, nil -} - -// ExportMetrics exports OpenTelemetry Metrics to Google Cloud Monitoring. -func (me *metricExporter) ExportMetrics(ctx context.Context, res *resource.Resource, ilr export.InstrumentationLibraryReader) error { - if err := me.exportMetricDescriptor(ctx, res, ilr); err != nil { +// Export exports OpenTelemetry Metrics to Google Cloud Monitoring. +func (me *metricExporter) Export(ctx context.Context, rm metricdata.ResourceMetrics) error { + if err := me.exportMetricDescriptor(ctx, rm); err != nil { return err } - if err := me.exportTimeSeries(ctx, res, ilr); err != nil { + if err := me.exportTimeSeries(ctx, rm); err != nil { return err } return nil @@ -194,29 +160,21 @@ func (me *metricExporter) ExportMetrics(ctx context.Context, res *resource.Resou // exportMetricDescriptor create MetricDescriptor from the record // if the descriptor is not registered in Cloud Monitoring yet. -func (me *metricExporter) exportMetricDescriptor(ctx context.Context, res *resource.Resource, ilr export.InstrumentationLibraryReader) error { +func (me *metricExporter) exportMetricDescriptor(ctx context.Context, rm metricdata.ResourceMetrics) error { mds := make(map[key]*googlemetricpb.MetricDescriptor) - aggError := ilr.ForEach(func(library instrumentation.Library, reader export.Reader) error { - return reader.ForEach(aggregation.CumulativeTemporalitySelector(), func(r export.Record) error { - k := keyOf(r.Descriptor(), library) + for _, scope := range rm.ScopeMetrics { + for _, metrics := range scope.Metrics { + k := keyOf(metrics, scope.Scope) if _, ok := me.mdCache[k]; ok { - return nil + continue } if _, localok := mds[k]; !localok { - md := me.recordToMdpb(&r) + md := me.recordToMdpb(metrics) mds[k] = md } - return nil - }) - - }) - if aggError != nil { - return aggError - } - if len(mds) == 0 { - return nil + } } // TODO: This process is synchronous and blocks longer time if records in cps @@ -256,22 +214,25 @@ func (me *metricExporter) createMetricDescriptorIfNeeded(ctx context.Context, md // exportTimeSeries create TimeSeries from the records in cps. // res should be the common resource among all TimeSeries, such as instance id, application name and so on. -func (me *metricExporter) exportTimeSeries(ctx context.Context, res *resource.Resource, ilr export.InstrumentationLibraryReader) error { +func (me *metricExporter) exportTimeSeries(ctx context.Context, rm metricdata.ResourceMetrics) error { tss := []*monitoringpb.TimeSeries{} + mr := me.resourceToMonitoredResourcepb(rm.Resource) + var errs []error - aggError := ilr.ForEach(func(library instrumentation.Library, reader export.Reader) error { - return reader.ForEach(aggregation.CumulativeTemporalitySelector(), func(r export.Record) error { - ts, err := me.recordToTspb(&r, res, library) + for _, scope := range rm.ScopeMetrics { + for _, metrics := range scope.Metrics { + ts, err := me.recordToTspb(metrics, mr, scope.Scope) if err != nil { - return err + errs = append(errs, err) + } else { + tss = append(tss, ts...) } - tss = append(tss, ts) - return nil - }) - }) + } + } - if len(tss) == 0 { - return nil + var aggError error + if len(errs) > 0 { + aggError = multierr.Combine(errs...) } if aggError != nil { @@ -282,6 +243,10 @@ func (me *metricExporter) exportTimeSeries(ctx context.Context, res *resource.Re } } + if len(tss) == 0 { + return nil + } + // TODO: When this exporter is rewritten, support writing to multiple // projects based on the "gcp.project.id" resource. req := &monitoringpb.CreateTimeSeriesRequest{ @@ -294,30 +259,28 @@ func (me *metricExporter) exportTimeSeries(ctx context.Context, res *resource.Re // descToMetricType converts descriptor to MetricType proto type. // Basically this returns default value ("custom.googleapis.com/opentelemetry/[metric type]") -func (me *metricExporter) descToMetricType(desc *sdkapi.Descriptor) string { +func (me *metricExporter) descToMetricType(desc metricdata.Metrics) string { if formatter := me.o.metricDescriptorTypeFormatter; formatter != nil { return formatter(desc) } - return fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, desc.Name()) + return fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, desc.Name) } // recordToMdpb extracts data and converts them to googlemetricpb.MetricDescriptor. -func (me *metricExporter) recordToMdpb(record *export.Record) *googlemetricpb.MetricDescriptor { - desc := record.Descriptor() - name := desc.Name() - unit := record.Descriptor().Unit() - kind, typ := recordToMdpbKindType(record) +func (me *metricExporter) recordToMdpb(metrics metricdata.Metrics) *googlemetricpb.MetricDescriptor { + name := metrics.Name + kind, valueType := recordToMdpbKindType(metrics.Data) // Detailed explanations on MetricDescriptor proto is not documented on // generated Go packages. Refer to the original proto file. // https://github.com/googleapis/googleapis/blob/50af053/google/api/metric.proto#L33 return &googlemetricpb.MetricDescriptor{ Name: name, - Type: me.descToMetricType(desc), + Type: me.descToMetricType(metrics), MetricKind: kind, - ValueType: typ, - Unit: string(unit), - Description: desc.Description(), + ValueType: valueType, + Unit: string(metrics.Unit), + Description: metrics.Description, } } @@ -428,44 +391,33 @@ func transformResource(match, input map[string]string) (map[string]string, bool) // recordToMdpbKindType return the mapping from OTel's record descriptor to // Cloud Monitoring's MetricKind and ValueType. -func recordToMdpbKindType(r *export.Record) (googlemetricpb.MetricDescriptor_MetricKind, googlemetricpb.MetricDescriptor_ValueType) { - var kind googlemetricpb.MetricDescriptor_MetricKind - switch r.Aggregation().Kind() { - case aggregation.LastValueKind: - kind = googlemetricpb.MetricDescriptor_GAUGE - case aggregation.SumKind: - kind = googlemetricpb.MetricDescriptor_CUMULATIVE - case aggregation.HistogramKind: +func recordToMdpbKindType(a metricdata.Aggregation) (googlemetricpb.MetricDescriptor_MetricKind, googlemetricpb.MetricDescriptor_ValueType) { + switch a.(type) { + case metricdata.Gauge[int64]: + return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64 + case metricdata.Gauge[float64]: + return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE + case metricdata.Sum[int64]: + return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_INT64 + case metricdata.Sum[float64]: + return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DOUBLE + case metricdata.Histogram: return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DISTRIBUTION default: - kind = googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED - } - var typ googlemetricpb.MetricDescriptor_ValueType - switch r.Descriptor().NumberKind() { - case number.Int64Kind: - typ = googlemetricpb.MetricDescriptor_INT64 - case number.Float64Kind: - typ = googlemetricpb.MetricDescriptor_DOUBLE - default: - typ = googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED + return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED } - - // TODO: Add handling for MeasureKind if necessary. - - return kind, typ } // recordToMpb converts data from records to Metric proto type for Cloud Monitoring. -func (me *metricExporter) recordToMpb(r *export.Record, library instrumentation.Library) *googlemetricpb.Metric { - desc := r.Descriptor() - k := keyOf(desc, library) +func (me *metricExporter) recordToMpb(metrics metricdata.Metrics, attributes attribute.Set, library instrumentation.Library) *googlemetricpb.Metric { + k := keyOf(metrics, library) md, ok := me.mdCache[k] if !ok { - md = me.recordToMdpb(r) + md = me.recordToMdpb(metrics) } labels := make(map[string]string) - iter := r.Attributes().Iter() + iter := attributes.Iter() for iter.Next() { kv := iter.Attribute() labels[normalizeLabelKey(string(kv.Key))] = sanitizeUTF8(kv.Value.Emit()) @@ -479,143 +431,142 @@ func (me *metricExporter) recordToMpb(r *export.Record, library instrumentation. // recordToTspb converts record to TimeSeries proto type with common resource. // ref. https://cloud.google.com/monitoring/api/ref_v3/rest/v3/TimeSeries -// -// TODO: Apply appropriate TimeInterval based upon MetricKind. See details in the doc. -// https://cloud.google.com/monitoring/api/ref_v3/rest/v3/TimeSeries#Point -// See detils in #25. -func (me *metricExporter) recordToTspb(r *export.Record, res *resource.Resource, library instrumentation.Library) (*monitoringpb.TimeSeries, error) { - m := me.recordToMpb(r, library) - mr := me.resourceToMonitoredResourcepb(res) - - agg := r.Aggregation() - nkind := r.Descriptor().NumberKind() - ikind := r.Descriptor().InstrumentKind() - - // TODO: Ignoring the case for Min, Max and Distribution to simply - // the first implementation. - // - // NOTE: Currently the selector used in the integrator is our own implementation, - // because none of those in go.opentelemetry.io/otel/sdk/metric/selector/simple - // gives interfaces to fetch LastValue. - // - // Views API should provide better interface that does not require the complicated codition handling - // done in this function. - // https://github.com/open-telemetry/opentelemetry-specification/issues/466 - // In OpenCensus, view interface provided the bundle of name, measure, labels and aggregation in one place, - // and it should return the appropriate value based on the aggregation type specified there. - switch agg.Kind() { - case aggregation.LastValueKind: - lv, ok := agg.(aggregation.LastValue) - if !ok { - return nil, errUnsupportedAggregation{agg: agg} +func (me *metricExporter) recordToTspb(m metricdata.Metrics, mr *monitoredrespb.MonitoredResource, library instrumentation.Scope) ([]*monitoringpb.TimeSeries, error) { + var tss []*monitoringpb.TimeSeries + errs := []error{} + switch a := m.Data.(type) { + case metricdata.Gauge[int64]: + tss = make([]*monitoringpb.TimeSeries, len(a.DataPoints)) + for _, point := range a.DataPoints { + ts, err := gaugeToTimeSeries[int64](point, m, mr) + if err != nil { + errs = append(errs, err) + continue + } + ts.Metric = me.recordToMpb(m, point.Attributes, library) + tss = append(tss, ts) } - return lastValueToTypedValueAndTimestamp(lv, nkind, m, mr) - case aggregation.SumKind: - // CUMULATIVE measurement should have the same start time and increasing end time. - // c.f. https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricKind - sum, ok := agg.(aggregation.Sum) - if !ok { - return nil, errUnsupportedAggregation{agg: agg} + case metricdata.Gauge[float64]: + tss = make([]*monitoringpb.TimeSeries, len(a.DataPoints)) + for _, point := range a.DataPoints { + ts, err := gaugeToTimeSeries[float64](point, m, mr) + if err != nil { + errs = append(errs, err) + continue + } + ts.Metric = me.recordToMpb(m, point.Attributes, library) + tss = append(tss, ts) } - return sumToTypedValueAndTimestamp(sum, nkind, me.startTime, time.Now(), m, mr) - case aggregation.HistogramKind: - hist, ok := agg.(aggregation.Histogram) - if !ok { - return nil, errUnsupportedAggregation{agg: agg} + case metricdata.Sum[int64]: + tss = make([]*monitoringpb.TimeSeries, len(a.DataPoints)) + for _, point := range a.DataPoints { + var ts *monitoringpb.TimeSeries + var err error + if a.IsMonotonic { + ts, err = sumToTimeSeries[int64](point, m, mr) + } else { + // Send non-monotonic sums as gauges + ts, err = gaugeToTimeSeries[int64](point, m, mr) + } + if err != nil { + errs = append(errs, err) + continue + } + ts.Metric = me.recordToMpb(m, point.Attributes, library) + tss = append(tss, ts) + } + case metricdata.Sum[float64]: + tss = make([]*monitoringpb.TimeSeries, len(a.DataPoints)) + for _, point := range a.DataPoints { + var ts *monitoringpb.TimeSeries + var err error + if a.IsMonotonic { + ts, err = sumToTimeSeries[float64](point, m, mr) + } else { + // Send non-monotonic sums as gauges + ts, err = gaugeToTimeSeries[float64](point, m, mr) + } + if err != nil { + errs = append(errs, err) + continue + } + ts.Metric = me.recordToMpb(m, point.Attributes, library) + tss = append(tss, ts) + } + case metricdata.Histogram: + tss = make([]*monitoringpb.TimeSeries, len(a.DataPoints)) + for _, point := range a.DataPoints { + ts, err := histogramToTimeSeries(point, m, mr) + if err != nil { + errs = append(errs, err) + continue + } + ts.Metric = me.recordToMpb(m, point.Attributes, library) + tss = append(tss, ts) } - return histogramToTypedValueAndTimestamp(hist, r, m, mr) + default: + errs = append(errs, errUnexpectedAggregationKind{kind: reflect.TypeOf(m.Data).String()}) } - return nil, errUnexpectedAggregationKind{kind: ikind} + return tss, multierr.Combine(errs...) } func sanitizeUTF8(s string) string { return strings.ToValidUTF8(s, "�") } -func lastValueToTypedValueAndTimestamp(lv aggregation.LastValue, kind number.Kind, m *googlemetricpb.Metric, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { - value, timestamp, err := lv.LastValue() - if err != nil { +func gaugeToTimeSeries[N int64 | float64](point metricdata.DataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { + value, valueType := numberDataPointToValue(point) + timestamp := timestamppb.New(point.Time) + if err := timestamp.CheckValid(); err != nil { return nil, err } - - timestampPb := timestamppb.New(timestamp) - err = timestampPb.CheckValid() - if err != nil { - return nil, err - } - - // TODO: Consider the expression of TimeInterval (#25) - t := &monitoringpb.TimeInterval{ - StartTime: timestampPb, - EndTime: timestampPb, - } - - tv, err := aggToTypedValue(kind, value) - if err != nil { - return nil, err - } - - p := &monitoringpb.Point{ - Value: tv, - Interval: t, - } - return &monitoringpb.TimeSeries{ - Metric: m, - Resource: mr, - Points: []*monitoringpb.Point{p}, + Resource: mr, + Unit: string(metrics.Unit), + MetricKind: googlemetricpb.MetricDescriptor_GAUGE, + ValueType: valueType, + Points: []*monitoringpb.Point{{ + Interval: &monitoringpb.TimeInterval{ + StartTime: timestamp, + EndTime: timestamp, + }, + Value: value, + }}, }, nil } -func sumToTypedValueAndTimestamp(sum aggregation.Sum, kind number.Kind, start, end time.Time, m *googlemetricpb.Metric, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { - value, err := sum.Sum() - if err != nil { - return nil, err - } - - t, err := toNonemptyTimeIntervalpb(start, end) - if err != nil { - return nil, err - } - - tv, err := aggToTypedValue(kind, value) +func sumToTimeSeries[N int64 | float64](point metricdata.DataPoint[N], metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { + interval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time) if err != nil { return nil, err } - - p := &monitoringpb.Point{ - Value: tv, - Interval: t, - } - + value, valueType := numberDataPointToValue[N](point) return &monitoringpb.TimeSeries{ - Metric: m, - Resource: mr, - Points: []*monitoringpb.Point{p}, + Resource: mr, + Unit: string(metrics.Unit), + MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, + ValueType: valueType, + Points: []*monitoringpb.Point{{ + Interval: interval, + Value: value, + }}, }, nil } -func histogramToTypedValueAndTimestamp(hist aggregation.Histogram, r *export.Record, m *googlemetricpb.Metric, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { - tv, err := histToTypedValue(hist) - if err != nil { - return nil, err - } - - t, err := toNonemptyTimeIntervalpb(r.StartTime(), r.EndTime()) +func histogramToTimeSeries(point metricdata.HistogramDataPoint, metrics metricdata.Metrics, mr *monitoredrespb.MonitoredResource) (*monitoringpb.TimeSeries, error) { + interval, err := toNonemptyTimeIntervalpb(point.StartTime, point.Time) if err != nil { return nil, err } - p := &monitoringpb.Point{ - Value: tv, - Interval: t, - } return &monitoringpb.TimeSeries{ Resource: mr, - Unit: string(r.Descriptor().Unit()), + Unit: string(metrics.Unit), MetricKind: googlemetricpb.MetricDescriptor_CUMULATIVE, ValueType: googlemetricpb.MetricDescriptor_DISTRIBUTION, - Points: []*monitoringpb.Point{p}, - Metric: m, + Points: []*monitoringpb.Point{{ + Interval: interval, + Value: histToTypedValue(point), + }}, }, nil } @@ -643,62 +594,51 @@ func toNonemptyTimeIntervalpb(start, end time.Time) (*monitoringpb.TimeInterval, }, nil } -func histToTypedValue(hist aggregation.Histogram) (*monitoringpb.TypedValue, error) { - buckets, err := hist.Histogram() - if err != nil { - return nil, err - } - counts := make([]int64, len(buckets.Counts)) - for i, v := range buckets.Counts { +func histToTypedValue(hist metricdata.HistogramDataPoint) *monitoringpb.TypedValue { + counts := make([]int64, len(hist.BucketCounts)) + for i, v := range hist.BucketCounts { counts[i] = int64(v) } - sum, err := hist.Sum() - if err != nil { - return nil, err - } - count, err := hist.Count() - if err != nil { - return nil, err - } var mean float64 - if !math.IsNaN(sum.AsFloat64()) && count > 0 { // Avoid divide-by-zero - mean = sum.AsFloat64() / float64(count) + if !math.IsNaN(hist.Sum) && hist.Count > 0 { // Avoid divide-by-zero + mean = hist.Sum / float64(hist.Count) } return &monitoringpb.TypedValue{ Value: &monitoringpb.TypedValue_DistributionValue{ DistributionValue: &distribution.Distribution{ - Count: int64(count), + Count: int64(hist.Count), Mean: mean, BucketCounts: counts, BucketOptions: &distribution.Distribution_BucketOptions{ Options: &distribution.Distribution_BucketOptions_ExplicitBuckets{ ExplicitBuckets: &distribution.Distribution_BucketOptions_Explicit{ - Bounds: buckets.Boundaries, + Bounds: hist.Bounds, }, }, }, // TODO: support exemplars }, }, - }, nil + } } -func aggToTypedValue(kind number.Kind, value number.Number) (*monitoringpb.TypedValue, error) { - switch kind { - case number.Int64Kind: - return &monitoringpb.TypedValue{ - Value: &monitoringpb.TypedValue_Int64Value{ - Int64Value: value.AsInt64(), - }, - }, nil - case number.Float64Kind: - return &monitoringpb.TypedValue{ - Value: &monitoringpb.TypedValue_DoubleValue{ - DoubleValue: value.AsFloat64(), - }, - }, nil - } - return nil, errUnexpectedNumberKind{kind: kind} +func numberDataPointToValue[N int64 | float64]( + point metricdata.DataPoint[N], +) (*monitoringpb.TypedValue, googlemetricpb.MetricDescriptor_ValueType) { + switch v := any(point.Value).(type) { + case int64: + return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ + Int64Value: v, + }}, + googlemetricpb.MetricDescriptor_INT64 + case float64: + return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DoubleValue{ + DoubleValue: v, + }}, + googlemetricpb.MetricDescriptor_DOUBLE + } + // It is impossible to reach this statement + return nil, googlemetricpb.MetricDescriptor_INT64 } // https://github.com/googleapis/googleapis/blob/c4c562f89acce603fb189679836712d08c7f8584/google/api/metric.proto#L149 diff --git a/exporter/metric/metric_test.go b/exporter/metric/metric_test.go index a71063844..fc3173374 100644 --- a/exporter/metric/metric_test.go +++ b/exporter/metric/metric_test.go @@ -24,14 +24,8 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/instrumentation" - controller "go.opentelemetry.io/otel/sdk/metric/controller/basic" - "go.opentelemetry.io/otel/sdk/metric/export" - "go.opentelemetry.io/otel/sdk/metric/export/aggregation" - "go.opentelemetry.io/otel/sdk/metric/metrictest" - "go.opentelemetry.io/otel/sdk/metric/number" - processor "go.opentelemetry.io/otel/sdk/metric/processor/basic" - "go.opentelemetry.io/otel/sdk/metric/processor/processortest" - "go.opentelemetry.io/otel/sdk/metric/sdkapi" + "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "go.opentelemetry.io/otel/sdk/resource" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" @@ -49,8 +43,8 @@ import ( ) var ( - formatter = func(d *sdkapi.Descriptor) string { - return fmt.Sprintf("test.googleapis.com/%s", d.Name()) + formatter = func(d metricdata.Metrics) string { + return fmt.Sprintf("test.googleapis.com/%s", d.Name) } ) @@ -67,8 +61,6 @@ func TestExportMetrics(t *testing.T) { option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), } res := &resource.Resource{} - aggSel := processortest.AggregatorSelector() - proc := processor.NewFactory(aggSel, aggregation.CumulativeTemporalitySelector()) opts := []Option{ WithProjectID("PROJECT_ID_NOT_REAL"), @@ -76,22 +68,21 @@ func TestExportMetrics(t *testing.T) { WithMetricDescriptorTypeFormatter(formatter), } - exporter, err := NewRawExporter(opts...) + exporter, err := New(opts...) if err != nil { t.Errorf("Error occurred when creating exporter: %v", err) } - cont := controller.New(proc, - controller.WithExporter(exporter), - controller.WithResource(res), + provider := metric.NewMeterProvider( + metric.WithReader(metric.NewPeriodicReader(exporter)), + metric.WithResource(res), ) - assert.NoError(t, cont.Start(ctx)) - meter := cont.Meter("test") + meter := provider.Meter("test") counter, err := meter.SyncInt64().Counter("name.lastvalue") require.NoError(t, err) counter.Add(ctx, 1) - require.NoError(t, cont.Stop(ctx)) + require.NoError(t, provider.Shutdown(ctx)) } func TestExportCounter(t *testing.T) { @@ -106,28 +97,26 @@ func TestExportCounter(t *testing.T) { option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), } - resOpt := controller.WithResource( - resource.NewWithAttributes( - semconv.SchemaURL, - attribute.String("test_id", "abc123"), - ), - ) - - pusher, err := InstallNewPipeline( - []Option{ - WithProjectID("PROJECT_ID_NOT_REAL"), - WithMonitoringClientOptions(clientOpts...), - WithMetricDescriptorTypeFormatter(formatter), - }, - resOpt, + exporter, err := New( + WithProjectID("PROJECT_ID_NOT_REAL"), + WithMonitoringClientOptions(clientOpts...), + WithMetricDescriptorTypeFormatter(formatter), ) assert.NoError(t, err) + provider := metric.NewMeterProvider( + metric.WithReader(metric.NewPeriodicReader(exporter)), + metric.WithResource( + resource.NewWithAttributes( + semconv.SchemaURL, + attribute.String("test_id", "abc123"), + )), + ) ctx := context.Background() - defer pusher.Stop(ctx) + defer provider.Shutdown(ctx) // Start meter - meter := pusher.Meter("cloudmonitoring/test") + meter := provider.Meter("cloudmonitoring/test") // Register counter value counter, err := meter.SyncInt64().Counter("counter-a") @@ -148,28 +137,28 @@ func TestExportHistogram(t *testing.T) { option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), } - resOpt := controller.WithResource( - resource.NewWithAttributes( - semconv.SchemaURL, - attribute.String("test_id", "abc123"), - ), + exporter, err := New( + WithProjectID("PROJECT_ID_NOT_REAL"), + WithMonitoringClientOptions(clientOpts...), + WithMetricDescriptorTypeFormatter(formatter), ) - - pusher, err := InstallNewPipeline( - []Option{ - WithProjectID("PROJECT_ID_NOT_REAL"), - WithMonitoringClientOptions(clientOpts...), - WithMetricDescriptorTypeFormatter(formatter), - }, - resOpt, + assert.NoError(t, err) + provider := metric.NewMeterProvider( + metric.WithReader(metric.NewPeriodicReader(exporter)), + metric.WithResource( + resource.NewWithAttributes( + semconv.SchemaURL, + attribute.String("test_id", "abc123"), + ), + ), ) assert.NoError(t, err) ctx := context.Background() - defer pusher.Stop(ctx) + defer provider.Shutdown(ctx) // Start meter - meter := pusher.Meter("cloudmonitoring/test") + meter := provider.Meter("cloudmonitoring/test") // Register counter value counter, err := meter.SyncInt64().Histogram("counter-a") @@ -192,9 +181,9 @@ func TestDescToMetricType(t *testing.T) { }, } - inDesc := []sdkapi.Descriptor{ - metrictest.NewDescriptor("testing", sdkapi.HistogramInstrumentKind, number.Float64Kind), - metrictest.NewDescriptor("test/of/path", sdkapi.HistogramInstrumentKind, number.Float64Kind), + inDesc := []metricdata.Metrics{ + {Name: "testing", Data: metricdata.Histogram{}}, + {Name: "test/of/path", Data: metricdata.Histogram{}}, } wants := []string{ @@ -203,7 +192,7 @@ func TestDescToMetricType(t *testing.T) { } for i, w := range wants { - out := inMe[i].descToMetricType(&inDesc[i]) + out := inMe[i].descToMetricType(inDesc[i]) if out != w { t.Errorf("expected: %v, actual: %v", w, out) } @@ -211,40 +200,11 @@ func TestDescToMetricType(t *testing.T) { } func TestRecordToMpb(t *testing.T) { - ctx := context.Background() - testServer, err := cloudmock.NewMetricTestServer() - go testServer.Serve() - defer testServer.Shutdown() - assert.NoError(t, err) - - clientOpts := []option.ClientOption{ - option.WithEndpoint(testServer.Endpoint), - option.WithoutAuthentication(), - option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), - } - - resOpt := controller.WithResource( - resource.NewWithAttributes( - semconv.SchemaURL, - attribute.String("test_id", "abc123"), - ), - ) - - pusher, err := InstallNewPipeline( - []Option{ - WithProjectID("PROJECT_ID_NOT_REAL"), - WithMonitoringClientOptions(clientOpts...), - WithMetricDescriptorTypeFormatter(formatter), - }, - resOpt, - ) - assert.NoError(t, err) - - desc := metrictest.NewDescriptor("testing", sdkapi.HistogramInstrumentKind, number.Float64Kind) + metricName := "testing" md := &googlemetricpb.MetricDescriptor{ - Name: desc.Name(), - Type: fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, desc.Name()), + Name: metricName, + Type: fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, metricName), MetricKind: googlemetricpb.MetricDescriptor_GAUGE, ValueType: googlemetricpb.MetricDescriptor_DOUBLE, Description: "test", @@ -260,15 +220,16 @@ func TestRecordToMpb(t *testing.T) { mdkey: md, }, } - meter := pusher.Meter("custom.googleapis.com/opentelemetry") - counter, err := meter.SyncInt64().Counter(desc.Name()) - require.NoError(t, err) - clabels := []attribute.KeyValue{ + + inputLibrary := instrumentation.Library{Name: "custom.googleapis.com/opentelemetry"} + inputAttributes := attribute.NewSet( attribute.Key("a").String("A"), attribute.Key("b_b").String("B"), attribute.Key("foo").Int64(100), + ) + inputMetrics := metricdata.Metrics{ + Name: metricName, } - counter.Add(ctx, 100, clabels...) want := &googlemetricpb.Metric{ Type: md.Type, @@ -278,19 +239,9 @@ func TestRecordToMpb(t *testing.T) { "foo": "100", }, } - require.NoError(t, pusher.Stop(ctx)) - - aggError := pusher.ForEach(func(library instrumentation.Library, reader export.Reader) error { - return reader.ForEach(aggregation.CumulativeTemporalitySelector(), func(r export.Record) error { - out := me.recordToMpb(&r, library) - if !reflect.DeepEqual(want, out) { - return fmt.Errorf("expected: %v, actual: %v", want, out) - } - return nil - }) - }) - if aggError != nil { - t.Errorf("%v", aggError) + out := me.recordToMpb(inputMetrics, inputAttributes, inputLibrary) + if !reflect.DeepEqual(want, out) { + t.Errorf("expected: %v, actual: %v", want, out) } } @@ -454,11 +405,9 @@ func TestResourceToMonitoredResourcepb(t *testing.T) { }, } - desc := metrictest.NewDescriptor("testing", sdkapi.HistogramInstrumentKind, number.Float64Kind) - md := &googlemetricpb.MetricDescriptor{ - Name: desc.Name(), - Type: fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, desc.Name()), + Name: "testing", + Type: fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, "testing"), MetricKind: googlemetricpb.MetricDescriptor_GAUGE, ValueType: googlemetricpb.MetricDescriptor_DOUBLE, Description: "test", @@ -598,11 +547,11 @@ func TestResourceToMonitoredResourcepbProjectIDUTF8(t *testing.T) { } func TestRecordToMpbUTF8(t *testing.T) { - desc := metrictest.NewDescriptor("testing", sdkapi.HistogramInstrumentKind, number.Float64Kind) + metricName := "testing" md := &googlemetricpb.MetricDescriptor{ - Name: desc.Name(), - Type: fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, desc.Name()), + Name: metricName, + Type: fmt.Sprintf(cloudMonitoringMetricDescriptorNameFormat, metricName), MetricKind: googlemetricpb.MetricDescriptor_GAUGE, ValueType: googlemetricpb.MetricDescriptor_DOUBLE, Description: "test", @@ -613,13 +562,6 @@ func TestRecordToMpbUTF8(t *testing.T) { libraryname: "", } - metricLabels := []attribute.KeyValue{ - attribute.Key("valid_ascii").String("abcdefg"), - attribute.Key("valid_utf8").String("שלום"), - attribute.Key("invalid_two_octet").String(invalidUtf8TwoOctet), - attribute.Key("invalid_sequence_id").String(invalidUtf8SequenceID), - } - expectedLabels := map[string]string{ "valid_ascii": "abcdefg", "valid_utf8": "שלום", @@ -627,55 +569,30 @@ func TestRecordToMpbUTF8(t *testing.T) { "invalid_sequence_id": "�", } - ctx := context.Background() - testServer, err := cloudmock.NewMetricTestServer() - go testServer.Serve() - defer testServer.Shutdown() - assert.NoError(t, err) - - clientOpts := []option.ClientOption{ - option.WithEndpoint(testServer.Endpoint), - option.WithoutAuthentication(), - option.WithGRPCDialOption(grpc.WithTransportCredentials(insecure.NewCredentials())), - } - - pusher, err := InstallNewPipeline( - []Option{ - WithProjectID("PROJECT_ID_NOT_REAL"), - WithMonitoringClientOptions(clientOpts...), - WithMetricDescriptorTypeFormatter(formatter), - }, - ) - assert.NoError(t, err) - me := &metricExporter{ o: &options{}, mdCache: map[key]*googlemetricpb.MetricDescriptor{ mdkey: md, }, } - meter := pusher.Meter("custom.googleapis.com/opentelemetry") - counter, err := meter.SyncInt64().Counter(desc.Name()) - require.NoError(t, err) - counter.Add(ctx, 100, metricLabels...) - require.NoError(t, pusher.Stop(ctx)) + inputLibrary := instrumentation.Library{Name: "custom.googleapis.com/opentelemetry"} + inputAttributes := attribute.NewSet( + attribute.Key("valid_ascii").String("abcdefg"), + attribute.Key("valid_utf8").String("שלום"), + attribute.Key("invalid_two_octet").String(invalidUtf8TwoOctet), + attribute.Key("invalid_sequence_id").String(invalidUtf8SequenceID)) + inputMetrics := metricdata.Metrics{ + Name: metricName, + } want := &googlemetricpb.Metric{ Type: md.Type, Labels: expectedLabels, } - aggError := pusher.ForEach(func(library instrumentation.Library, reader export.Reader) error { - return reader.ForEach(aggregation.CumulativeTemporalitySelector(), func(r export.Record) error { - out := me.recordToMpb(&r, library) - if !reflect.DeepEqual(want, out) { - return fmt.Errorf("expected: %v, actual: %v", want, out) - } - return nil - }) - }) - if aggError != nil { - t.Errorf("%v", aggError) + out := me.recordToMpb(inputMetrics, inputAttributes, inputLibrary) + if !reflect.DeepEqual(want, out) { + t.Errorf("expected: %v, actual: %v", want, out) } } @@ -794,8 +711,6 @@ func TestExportMetricsWithUserAgent(t *testing.T) { } clientOpts = append(clientOpts, tc.extraOpts...) res := &resource.Resource{} - aggSel := processortest.AggregatorSelector() - proc := processor.NewFactory(aggSel, aggregation.CumulativeTemporalitySelector()) ctx := context.Background() opts := []Option{ @@ -804,23 +719,22 @@ func TestExportMetricsWithUserAgent(t *testing.T) { WithMetricDescriptorTypeFormatter(formatter), } - exporter, err := NewRawExporter(opts...) + exporter, err := New(opts...) if err != nil { t.Errorf("Error occurred when creating exporter: %v", err) } - cont := controller.New(proc, - controller.WithExporter(exporter), - controller.WithResource(res), + provider := metric.NewMeterProvider( + metric.WithReader(metric.NewPeriodicReader(exporter)), + metric.WithResource(res), ) - assert.NoError(t, cont.Start(ctx)) - meter := cont.Meter("test") + meter := provider.Meter("test") counter, err := meter.SyncInt64().Counter("name.lastvalue") require.NoError(t, err) counter.Add(ctx, 1) - require.NoError(t, cont.Stop(ctx)) + require.NoError(t, provider.ForceFlush(ctx)) // User agent checking happens above in parallel to this flow. }) diff --git a/exporter/metric/option.go b/exporter/metric/option.go index 6e4145a2c..f5bf025ca 100644 --- a/exporter/metric/option.go +++ b/exporter/metric/option.go @@ -17,10 +17,9 @@ package metric import ( "context" "fmt" - "time" "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/sdk/metric/sdkapi" + "go.opentelemetry.io/otel/sdk/metric/metricdata" apioption "google.golang.org/api/option" ) @@ -41,7 +40,7 @@ type options struct { context context.Context // metricDescriptorTypeFormatter is the custom formtter for the MetricDescriptor.Type. // By default, the format string is "custom.googleapis.com/opentelemetry/[metric name]". - metricDescriptorTypeFormatter func(*sdkapi.Descriptor) string + metricDescriptorTypeFormatter func(metricdata.Metrics) string // onError is the hook to be called when there is an error uploading the metric data. // If no custom hook is set, errors are logged. Optional. // @@ -61,9 +60,6 @@ type options struct { // to the underlying Stackdriver Monitoring API client. // Optional. monitoringClientOptions []apioption.ClientOption - // reportingInterval sets the interval between reporting metrics. - // If it is set to zero then default value is used. - reportingInterval time.Duration } // WithProjectID sets Google Cloud Platform project as projectID. @@ -85,20 +81,11 @@ func WithMonitoringClientOptions(opts ...apioption.ClientOption) func(o *options } } -// WithInterval sets the interval for metric exporter to send data to Cloud Monitoring. -// t should not be less than 10 seconds. -// c.f. https://cloud.google.com/monitoring/docs/release-notes#March_30_2020 -func WithInterval(t time.Duration) func(o *options) { - return func(o *options) { - o.reportingInterval = t - } -} - // WithMetricDescriptorTypeFormatter sets the custom formatter for MetricDescriptor. // Note that the format has to follow the convention defined in the official document. // The default is "custom.googleapis.com/[metric name]". // ref. https://cloud.google.com/monitoring/custom-metrics/creating-metrics#custom_metric_names -func WithMetricDescriptorTypeFormatter(f func(*sdkapi.Descriptor) string) func(o *options) { +func WithMetricDescriptorTypeFormatter(f func(metricdata.Metrics) string) func(o *options) { return func(o *options) { o.metricDescriptorTypeFormatter = f } diff --git a/exporter/trace/go.mod b/exporter/trace/go.mod index 24218f86c..d308de5cd 100644 --- a/exporter/trace/go.mod +++ b/exporter/trace/go.mod @@ -7,10 +7,10 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 github.com/stretchr/testify v1.8.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0 - go.opentelemetry.io/otel v1.9.0 - go.opentelemetry.io/otel/sdk v1.9.0 - go.opentelemetry.io/otel/trace v1.9.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 + go.opentelemetry.io/otel v1.10.0 + go.opentelemetry.io/otel/sdk v1.10.0 + go.opentelemetry.io/otel/trace v1.10.0 golang.org/x/net v0.0.0-20220325170049-de3da57026de // indirect golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 // indirect @@ -36,7 +36,7 @@ require ( github.com/googleapis/gax-go/v2 v2.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.opencensus.io v0.23.0 // indirect - go.opentelemetry.io/otel/metric v0.31.0 // indirect + go.opentelemetry.io/otel/metric v0.32.1 // indirect go.uber.org/atomic v1.7.0 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/exporter/trace/go.sum b/exporter/trace/go.sum index d5207fda5..b050cc73f 100644 --- a/exporter/trace/go.sum +++ b/exporter/trace/go.sum @@ -213,16 +213,16 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0 h1:9NkMW03wwEzPtP/KciZ4Ozu/Uz5ZA7kfqXJIObnrjGU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0/go.mod h1:548ZsYzmT4PL4zWKRd8q/N4z0Wxzn/ZxUE+lkEpwWQA= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs= -go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= -go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= -go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0 h1:qZ3KzA4qPzLBDtQyPk4ydjlg8zvXbNysnFHaVMKJbVo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.0/go.mod h1:14Oo79mRwusSI02L0EfG3Gp1uF3+1wSL+D4zDysxyqs= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/metric v0.32.1 h1:ftff5LSBCIDwL0UkhBuDg8j9NNxx2IusvJ18q9h6RC4= +go.opentelemetry.io/otel/metric v0.32.1/go.mod h1:iLPP7FaKMAD5BIxJ2VX7f2KTuz//0QK2hEUyti5psqQ= +go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= diff --git a/go.mod b/go.mod index faccbc5a4..bffa60891 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.17 require ( github.com/google/go-cmp v0.5.8 - go.opentelemetry.io/otel v1.9.0 - go.opentelemetry.io/otel/trace v1.9.0 + go.opentelemetry.io/otel v1.10.0 + go.opentelemetry.io/otel/trace v1.10.0 ) require ( diff --git a/go.sum b/go.sum index 38d604a35..c915c660e 100644 --- a/go.sum +++ b/go.sum @@ -6,10 +6,10 @@ github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/resourcemapping/go.mod b/internal/resourcemapping/go.mod index 5548f177d..a8d8be9b0 100644 --- a/internal/resourcemapping/go.mod +++ b/internal/resourcemapping/go.mod @@ -2,6 +2,6 @@ module github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resou go 1.17 -require go.opentelemetry.io/otel v1.9.0 +require go.opentelemetry.io/otel v1.10.0 -require go.opentelemetry.io/otel/trace v1.9.0 // indirect +require go.opentelemetry.io/otel/trace v1.10.0 // indirect diff --git a/internal/resourcemapping/go.sum b/internal/resourcemapping/go.sum index ad3c2707d..b0149d349 100644 --- a/internal/resourcemapping/go.sum +++ b/internal/resourcemapping/go.sum @@ -2,8 +2,8 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8 github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= -go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= -go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=