Skip to content

Commit

Permalink
fix(metrics): bump opentelemetry dependenncies
Browse files Browse the repository at this point in the history
Move server.rpc.duration metric to server.rpc.duration_deprecated,
as it is now included in the otelgrpc opentelemetry contrib
package. A side effect of this is that we loose the status code attr.

Status on this can be tracked here:
open-telemetry/opentelemetry-go-contrib#2840
  • Loading branch information
liufuyang committed Feb 18, 2023
1 parent 89c052d commit d9bd400
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 56 deletions.
21 changes: 11 additions & 10 deletions cloudmonitoring/metricmiddleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric/global"
"go.opentelemetry.io/otel/metric/instrument"
"go.opentelemetry.io/otel/metric/instrument/syncint64"
"go.opentelemetry.io/otel/metric/unit"
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
"google.golang.org/grpc"
Expand All @@ -20,8 +19,10 @@ import (
// Metric names are based on OTEL semantic conventions for metrics.
// See:
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics
// We still had to implement the following metrics below, later we can remove some by following the progress of
// https://github.com/open-telemetry/opentelemetry-go-contrib/issues/2840
const (
serverRequestDurationMetricName = "rpc.server.duration"
serverRequestDurationMetricName = "rpc.server.duration_deprecated"
clientRequestDurationMetricName = "rpc.client.duration"

// there is no rpc_count equivalent int OTEL semantic conventions yet.
Expand All @@ -32,31 +33,31 @@ const (
func NewMetricMiddleware() (MetricMiddleware, error) {
meter := global.MeterProvider().Meter("cloudrunner-go/cloudmonitoring")

serverRequestCount, err := meter.SyncInt64().Counter(
serverRequestCount, err := meter.Int64Counter(
serverRequestCountMetricName,
instrument.WithUnit(unit.Dimensionless),
instrument.WithDescription("Count of RPCs received by a gRPC server."),
)
if err != nil {
return MetricMiddleware{}, fmt.Errorf("create server request count counter: %w", err)
}
serverRequestDuration, err := meter.SyncInt64().Histogram(
serverRequestDuration, err := meter.Int64Histogram(
serverRequestDurationMetricName,
instrument.WithUnit(unit.Milliseconds),
instrument.WithDescription("Duration of RPCs received by a gRPC server."),
)
if err != nil {
return MetricMiddleware{}, fmt.Errorf("create server request duration histogram: %w", err)
}
clientRequestCount, err := meter.SyncInt64().Counter(
clientRequestCount, err := meter.Int64Counter(
clientRequestCountMetricName,
instrument.WithUnit(unit.Dimensionless),
instrument.WithDescription("Count of RPCs sent by a gRPC client."),
)
if err != nil {
return MetricMiddleware{}, fmt.Errorf("create client request count counter: %w", err)
}
clientRequestDuration, err := meter.SyncInt64().Histogram(
clientRequestDuration, err := meter.Int64Histogram(
clientRequestDurationMetricName,
instrument.WithUnit(unit.Milliseconds),
instrument.WithDescription("Duration of RPCs sent by a gRPC client."),
Expand All @@ -73,10 +74,10 @@ func NewMetricMiddleware() (MetricMiddleware, error) {
}

type MetricMiddleware struct {
serverRequestCount syncint64.Counter
serverRequestDuration syncint64.Histogram
clientRequestCount syncint64.Counter
clientRequestDuration syncint64.Histogram
serverRequestCount instrument.Int64Counter
serverRequestDuration instrument.Int64Histogram
clientRequestCount instrument.Int64Counter
clientRequestDuration instrument.Int64Histogram
}

// GRPCUnaryServerInterceptor implements grpc.UnaryServerInterceptor and
Expand Down
30 changes: 15 additions & 15 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,29 @@ require (
cloud.google.com/go/compute/metadata v0.2.3
cloud.google.com/go/profiler v0.3.1
cloud.google.com/go/pubsub v1.28.0
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.34.1
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.10.1
github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221104160235-e955c204f4f2
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.35.2
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.11.2
github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.35.2
github.com/google/go-cmp v0.5.9
github.com/soheilhy/cmux v0.1.5
go.einride.tech/protobuf-sensitive v0.3.0
go.opencensus.io v0.24.0
go.opentelemetry.io/contrib/detectors/gcp v1.11.1
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4
go.opentelemetry.io/contrib/instrumentation/host v0.36.4
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4
go.opentelemetry.io/contrib/instrumentation/runtime v0.36.4
go.opentelemetry.io/contrib/detectors/gcp v1.14.0
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0
go.opentelemetry.io/contrib/instrumentation/host v0.39.0
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.39.0
go.opentelemetry.io/contrib/instrumentation/runtime v0.39.0
go.opentelemetry.io/otel v1.13.0
go.opentelemetry.io/otel/bridge/opencensus v0.33.0
go.opentelemetry.io/otel/metric v0.33.0
go.opentelemetry.io/otel/sdk v1.11.1
go.opentelemetry.io/otel/sdk/metric v0.33.0
go.opentelemetry.io/otel/bridge/opencensus v0.36.0
go.opentelemetry.io/otel/metric v0.36.0
go.opentelemetry.io/otel/sdk v1.13.0
go.opentelemetry.io/otel/sdk/metric v0.36.0
go.uber.org/zap v1.24.0
golang.org/x/oauth2 v0.4.0
golang.org/x/sync v0.1.0
google.golang.org/api v0.109.0
google.golang.org/genproto v0.0.0-20230202175211-008b39050e57
google.golang.org/grpc v1.52.3
google.golang.org/grpc v1.53.0
google.golang.org/grpc/examples v0.0.0-20220915225546-9c3e589d3ee6
google.golang.org/protobuf v1.28.1
gopkg.in/yaml.v3 v3.0.1
Expand All @@ -40,8 +40,8 @@ require (
cloud.google.com/go/compute v1.18.0 // indirect
cloud.google.com/go/monitoring v1.12.0 // indirect
cloud.google.com/go/trace v1.8.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.11.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.34.1 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.11.2 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.35.2 // indirect
github.com/benbjohnson/clock v1.3.0 // indirect
github.com/felixge/httpsnoop v1.0.3 // indirect
github.com/go-logr/logr v1.2.3 // indirect
Expand Down
62 changes: 31 additions & 31 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,17 @@ cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcb
cloud.google.com/go/trace v1.8.0 h1:GFPLxbp5/FzdgTzor3nlNYNxMd6hLmzkE7sA9F0qQcA=
cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.11.0 h1:hc3Fb+ufGf+EznhPOSvQODMl9Qn++cATyI/7q7E7geM=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.11.0/go.mod h1:HpmGbYLf1fsWiqVA0Z2oKh7qi7BroCgOl2NqB2N/TG4=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.34.1 h1:kbfuKQkOFb2XuuEcMTYbWtlVPiNKhLTyDjQcKx1pFqQ=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.34.1/go.mod h1:pGSEvxQ2PGMKdz6oiiTjzfM8pWtoWHSymSyUHMsZkUA=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.10.1 h1:E0Hwk1YC0lWXJboAvQrOnDSyVpmdlqC2v4m+GNmNszA=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.10.1/go.mod h1:ZWWusXNLjdTConvbpJZf+/5xxtLfu7y3hRfKjmb/DOI=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.34.1 h1:2G1eO4RSvcTNncDivyGTd3Zh9tozmMeA2JpF07QEYlc=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.34.1 h1:2zV0DiJaSJ+zoaYwMuWAkqMQyLggPfStnrwrFNv+ty4=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.34.1/go.mod h1:oBeOrlgeIZVX6bRZ+TDJiEuL1bsDdgAWKa4iETycZf8=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221104160235-e955c204f4f2 h1:B5e6QFA7aJvO+vEXYJMW38Rv3riaQ7qbbVlMARRLP2Y=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.0.0-20221104160235-e955c204f4f2/go.mod h1:FwtSi1M0P8cuMlHxVso1vcivukprUr1bBwf15CRypOI=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.11.2 h1:SX09eVD4XAKlpNyE5Pn01Zgxk02hNECeLFpNKL8bnvs=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.11.2/go.mod h1:HpmGbYLf1fsWiqVA0Z2oKh7qi7BroCgOl2NqB2N/TG4=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.35.2 h1:++Qgr1MbEOUE23DXDSUDGFJ+U9ZLR660B90vukYPujw=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.35.2/go.mod h1:pM+AqjI/HkONjZRQVQ8fMA1PB6fUm211G+8WBc0dm0Q=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.11.2 h1:Z5/bjyZhqXd7dNI76Z/KnyxtqavKF1UgGhInFSAIa8s=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.11.2/go.mod h1:mHbBqn8wTt1/+bTA55xe2mLX5b+RKz2dVcGz8sH2HsY=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.35.2 h1:xXo67CnDmiDMhgD3zAiuejKKMQ9nNkAQZZ4RS5U5jJY=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.35.2 h1:uH5W8NML+jD8iFiBbNUh5X7Nt0FVDK44Hel+Ux0ZEqU=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.35.2/go.mod h1:H785fvlgotVZqht+1rHhXSs8EJ8uPVmpBYkTYO3ccpc=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.35.2 h1:IQlPynyfnjOw8ftWF2bnejabsr5poV627y64Ued2I6o=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/propagator v0.35.2/go.mod h1:1+b5oFxaeaSoN5Iapn/8DV9VCJOvNA9jVLXJFcoGXOM=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
Expand Down Expand Up @@ -129,26 +129,26 @@ go.einride.tech/protobuf-sensitive v0.3.0 h1:CRIEF833SXINoCaZp7V8GqB+65bLgNGzVH+
go.einride.tech/protobuf-sensitive v0.3.0/go.mod h1:nwu0o4M/iWVo24hAn+3PDs6Ja2Mw3g8oDgyy7Rzw8k0=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/contrib/detectors/gcp v1.11.1 h1:y6EXzhjnuYY6EV12OYW3eITeZ+lHtxsXCR3KpCJCfUY=
go.opentelemetry.io/contrib/detectors/gcp v1.11.1/go.mod h1:AuTCkYDcf6pXtddWv8aWdz+ohbDg4RsjVYUHGMWM4fE=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 h1:PRXhsszxTt5bbPriTjmaweWUsAnJYeWBhUMLRetUgBU=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4/go.mod h1:05eWWy6ZWzmpeImD3UowLTB3VjDMU1yxQ+ENuVWDM3c=
go.opentelemetry.io/contrib/instrumentation/host v0.36.4 h1:2D0q/69KewnkCkOI9I9uXgi1XQXvwQIfMebMcPft0no=
go.opentelemetry.io/contrib/instrumentation/host v0.36.4/go.mod h1:IQdse+GFHec/g2M4wtj6cE4uA5PJGQjjXP/602LjHBQ=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 h1:aUEBEdCa6iamGzg6fuYxDA8ThxvOG240mAvWDU+XLio=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4/go.mod h1:l2MdsbKTocpPS5nQZscqTR9jd8u96VYZdcpF8Sye7mA=
go.opentelemetry.io/contrib/instrumentation/runtime v0.36.4 h1:7AY5NdRzyU5s1ek3E4VK3FBnPtQ6La1i7sIn9hNgjsk=
go.opentelemetry.io/contrib/instrumentation/runtime v0.36.4/go.mod h1:yFSLOnffweT7Es+IzY1DF5KP0xa2Wl15SJfKqAyDXq8=
go.opentelemetry.io/contrib/detectors/gcp v1.14.0 h1:o2NurqCUGl7GaHH5vQjzYnjijlX2zrKneN7qsgia138=
go.opentelemetry.io/contrib/detectors/gcp v1.14.0/go.mod h1:UJf0kFmOn9CIuLs1SgvqAMF8Pwna1cLHOKHqqTGSlK4=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0 h1:MUes2rbdXa1ce9mwKYzTyBG0CtqpLT0NgKTFAz8FIDs=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0/go.mod h1:tETUy0CG/bwb1vHaXyNZJJP9395sjxlQQ5e69KtvZMc=
go.opentelemetry.io/contrib/instrumentation/host v0.39.0 h1:Or1wW8y36CbHBoyDAlyaqC+MhOjCVWwEl0/918oZuFo=
go.opentelemetry.io/contrib/instrumentation/host v0.39.0/go.mod h1:zpJ1y4HkljiUwVaOqfZNLEMqnL2sT+2mTC61ilOMTzQ=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.39.0 h1:vFEBG7SieZJzvnRWQ81jxpuEqe6J8Ex+hgc9CqOTzHc=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.39.0/go.mod h1:9rgTcOKdIhDOC0IcAu8a+R+FChqSUBihKpM1lVNi6T0=
go.opentelemetry.io/contrib/instrumentation/runtime v0.39.0 h1:AtfO01+aMX/GUk4IORJ4digf2LhwnSxWt3WvoKBZUL4=
go.opentelemetry.io/contrib/instrumentation/runtime v0.39.0/go.mod h1:iEjHFZQDi7GrrAom60DLW/GC7dFLECacBhZjGC+Sf80=
go.opentelemetry.io/otel v1.13.0 h1:1ZAKnNQKwBBxFtww/GwxNUyTf0AxkZzrukO8MeXqe4Y=
go.opentelemetry.io/otel v1.13.0/go.mod h1:FH3RtdZCzRkJYFTCsAKDy9l/XYjMdNv6QrkFFB8DvVg=
go.opentelemetry.io/otel/bridge/opencensus v0.33.0 h1:DnSFYr/VxUVwkHL0UoaMcxx74Jugb1HO0B08cYBmi0c=
go.opentelemetry.io/otel/bridge/opencensus v0.33.0/go.mod h1:gylOY4P2e7kPYc6T9M8XfQ5+RK4+evGorTOOy+gO4Nc=
go.opentelemetry.io/otel/metric v0.33.0 h1:xQAyl7uGEYvrLAiV/09iTJlp1pZnQ9Wl793qbVvED1E=
go.opentelemetry.io/otel/metric v0.33.0/go.mod h1:QlTYc+EnYNq/M2mNk1qDDMRLpqCOj2f/r5c7Fd5FYaI=
go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs=
go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys=
go.opentelemetry.io/otel/sdk/metric v0.33.0 h1:oTqyWfksgKoJmbrs2q7O7ahkJzt+Ipekihf8vhpa9qo=
go.opentelemetry.io/otel/sdk/metric v0.33.0/go.mod h1:xdypMeA21JBOvjjzDUtD0kzIcHO/SPez+a8HOzJPGp0=
go.opentelemetry.io/otel/bridge/opencensus v0.36.0 h1:/RJRbdVBP+Yoh6tx8zu0L+b1KE/iGmo3adr5LUvCGWA=
go.opentelemetry.io/otel/bridge/opencensus v0.36.0/go.mod h1:otgxgSPzGNRPjDYJUrQwqGu4MXRngDPEbFxuVl355Fk=
go.opentelemetry.io/otel/metric v0.36.0 h1:t0lgGI+L68QWt3QtOIlqM9gXoxqxWLhZ3R/e5oOAY0Q=
go.opentelemetry.io/otel/metric v0.36.0/go.mod h1:wKVw57sd2HdSZAzyfOM9gTqqE8v7CbqWsYL6AyrH9qk=
go.opentelemetry.io/otel/sdk v1.13.0 h1:BHib5g8MvdqS65yo2vV1s6Le42Hm6rrw08qU6yz5JaM=
go.opentelemetry.io/otel/sdk v1.13.0/go.mod h1:YLKPx5+6Vx/o1TCUYYs+bpymtkmazOMT6zoRrC7AQ7I=
go.opentelemetry.io/otel/sdk/metric v0.36.0 h1:dEXpkkOAEcHiRiaZdvd63MouV+3bCtAB/bF3jlNKnr8=
go.opentelemetry.io/otel/sdk/metric v0.36.0/go.mod h1:Lv4HQQPSCSkhyBKzLNtE8YhTSdK4HCwNh3lh7CiR20s=
go.opentelemetry.io/otel/trace v1.13.0 h1:CBgRZ6ntv+Amuj1jDsMhZtlAPT6gbyIRdaIzFhfBSdY=
go.opentelemetry.io/otel/trace v1.13.0/go.mod h1:muCvmmO9KKpvuXSf3KKAXXB2ygNYHQ+ZfI5X08d3tds=
go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
Expand Down Expand Up @@ -235,8 +235,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ=
google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
google.golang.org/grpc/examples v0.0.0-20220915225546-9c3e589d3ee6 h1:pp7qdLe0KT/hXMNr0KxZeCFQvIudg8Ltp5yKmuzB2r0=
google.golang.org/grpc/examples v0.0.0-20220915225546-9c3e589d3ee6/go.mod h1:gxndsbNG1n4TZcHGgsYEfVGnTxqfEdfiDv6/DADXX9o=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
Expand Down

0 comments on commit d9bd400

Please sign in to comment.