Skip to content

Commit 3be94cf

Browse files
nrwiersmaUllaakut
andauthored
feat: support profiling (#250)
Co-authored-by: Brendan Le Glaunec <brendan@glaulabs.com>
1 parent 5ae01f4 commit 3be94cf

8 files changed

Lines changed: 302 additions & 1 deletion

File tree

.golangci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ linters:
2626
- exhaustive
2727
- exhaustruct
2828
- forcetypeassert
29+
- funlen
2930
- gochecknoglobals
3031
- gochecknoinits
3132
- goerr113

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,34 @@ This flag sets tag key value pairs to set on all stats. This flag can be specifi
134134

135135
Example: `--stats.tags="app=my-app" --stats.tags="zone=eu-west"`
136136

137+
### Profiler
138+
139+
The profiler flags are used by `cmd.NewProfiler` to create a Pyroscope `*pyroscope.Profiler`.
140+
141+
#### FlagProfilingDSN: *--profiling.dsn, $PROFILING_DSN*
142+
143+
This flag configures the URL, authentication and optionally the Tenant ID for Pyroscope.
144+
145+
Example: `--profiling.dsn=https://user:pass@host/path?token=auth-token&tenantid=my-tenant-id`
146+
147+
#### FlagProfileUploadRate: *--profiling.upload-rate, $PROFILING_UPLOAD_RATE*
148+
149+
This flag configures the rate at which profiles are uploaded.
150+
151+
Example: `--profiling.upload-rate=10s`
152+
153+
#### FlagProfilingTags: *--profiling.tags, $PROFILING_TAGS*
154+
155+
This configures a list of tags appended to every profile. This flag can be specified multiple times.
156+
157+
Example: `--profiling.tags="app=my-app" --profiling.tags="zone=eu-west"`
158+
159+
#### FlagProfilingTypes: *--profiling.types, $PROFILING_TYPES*
160+
161+
This configures the profile types that are captured. By default all supported types are captured. This flag can be specified multiple times.
162+
163+
Example: `--profiling.types=cpu --profiling.types=inuse_object`
164+
137165
### Tracer
138166

139167
The tracing flags are used by `cmd.NewTracer` to create a new open telemetry `trace.TraceProvider`.

example_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,27 @@ func ExampleNewStatter() {
4040
_ = stats
4141
}
4242

43+
func ExampleNewProfiler() {
44+
var c *cli.Context // Get this from your action
45+
46+
log, err := cmd.NewLogger(c)
47+
if err != nil {
48+
// Handle error.
49+
return
50+
}
51+
52+
prof, err := cmd.NewProfiler(c, "my-service", log)
53+
if err != nil {
54+
// Handle error.
55+
return
56+
}
57+
if prof != nil {
58+
defer func() { _ = prof.Stop() }()
59+
}
60+
61+
_ = prof
62+
}
63+
4364
func ExampleNewTracer() {
4465
var c *cli.Context // Get this from your action
4566

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ go 1.21
44

55
require (
66
github.com/fatih/color v1.16.0
7+
github.com/grafana/otel-profiling-go v0.5.1
8+
github.com/grafana/pyroscope-go v1.1.1
79
github.com/hamba/logger/v2 v2.5.1
810
github.com/hamba/statter/v2 v2.3.5
911
github.com/stretchr/testify v1.9.0
@@ -28,7 +30,9 @@ require (
2830
github.com/go-logr/stdr v1.2.2 // indirect
2931
github.com/go-stack/stack v1.8.1 // indirect
3032
github.com/golang/protobuf v1.5.3 // indirect
33+
github.com/grafana/pyroscope-go/godeltaprof v0.1.6 // indirect
3134
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect
35+
github.com/klauspost/compress v1.17.3 // indirect
3236
github.com/mattn/go-colorable v0.1.13 // indirect
3337
github.com/mattn/go-isatty v0.0.20 // indirect
3438
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect

go.sum

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj
1010
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1111
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
1212
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
13+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1314
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1415
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1516
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
1617
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
1718
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
19+
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
1820
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
1921
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
2022
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
@@ -27,13 +29,21 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
2729
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
2830
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
2931
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
32+
github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8=
33+
github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls=
34+
github.com/grafana/pyroscope-go v1.1.1 h1:PQoUU9oWtO3ve/fgIiklYuGilvsm8qaGhlY4Vw6MAcQ=
35+
github.com/grafana/pyroscope-go v1.1.1/go.mod h1:Mw26jU7jsL/KStNSGGuuVYdUq7Qghem5P8aXYXSXG88=
36+
github.com/grafana/pyroscope-go/godeltaprof v0.1.6 h1:nEdZ8louGAplSvIJi1HVp7kWvFvdiiYg3COLlTwJiFo=
37+
github.com/grafana/pyroscope-go/godeltaprof v0.1.6/go.mod h1:Tk376Nbldo4Cha9RgiU7ik8WKFkNpfds98aUzS8omLE=
3038
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=
3139
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=
3240
github.com/hamba/logger/v2 v2.5.1 h1:EM+S6CPYIs66XmW9kK/RBghgtkLcO4kQWWPAlsIwNR4=
3341
github.com/hamba/logger/v2 v2.5.1/go.mod h1:b+y7XddZMTTSIjKdOOIHWlhg1hMoE9eKhanB9wPNLj0=
3442
github.com/hamba/statter/v2 v2.3.5 h1:qAFu+n4Q08LtrBdcBYexItfOoJJ16D/m/boq8fm5hn4=
3543
github.com/hamba/statter/v2 v2.3.5/go.mod h1:LS7DqETxoVpRraL3tn9O70zYCaVRL2A98SvZw/LZkAI=
3644
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
45+
github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA=
46+
github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
3747
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
3848
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
3949
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -61,8 +71,14 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN
6171
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
6272
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
6373
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
74+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
75+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
76+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
6477
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
6578
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
79+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
80+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
81+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
6682
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
6783
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
6884
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
@@ -73,6 +89,7 @@ github.com/valyala/histogram v1.2.0 h1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OL
7389
github.com/valyala/histogram v1.2.0/go.mod h1:Hb4kBwb4UxsaNbbbh+RRz8ZR6pdodR57tzWUS3BUzXY=
7490
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI=
7591
github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
92+
go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
7693
go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
7794
go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
7895
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8=
@@ -83,10 +100,13 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6
83100
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM=
84101
go.opentelemetry.io/otel/exporters/zipkin v1.24.0 h1:3evrL5poBuh1KF51D9gO/S+N/1msnm4DaBqs/rpXUqY=
85102
go.opentelemetry.io/otel/exporters/zipkin v1.24.0/go.mod h1:0EHgD8R0+8yRhUYJOGR8Hfg2dpiJQxDOszd5smVO9wM=
103+
go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
86104
go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
87105
go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
106+
go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
88107
go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
89108
go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
109+
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
90110
go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
91111
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
92112
go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=
@@ -97,6 +117,7 @@ golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
97117
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
98118
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
99119
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
120+
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
100121
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
101122
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
102123
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
@@ -117,5 +138,6 @@ google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh
117138
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
118139
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
119140
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
141+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
120142
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
121143
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

profile.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package cmd
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"net/url"
7+
"time"
8+
9+
"github.com/grafana/pyroscope-go"
10+
"github.com/hamba/logger/v2"
11+
"github.com/urfave/cli/v2"
12+
)
13+
14+
var allProfilingTypes = []pyroscope.ProfileType{
15+
pyroscope.ProfileCPU,
16+
pyroscope.ProfileInuseObjects,
17+
pyroscope.ProfileAllocObjects,
18+
pyroscope.ProfileInuseSpace,
19+
pyroscope.ProfileAllocSpace,
20+
pyroscope.ProfileGoroutines,
21+
pyroscope.ProfileMutexCount,
22+
pyroscope.ProfileMutexDuration,
23+
pyroscope.ProfileBlockCount,
24+
pyroscope.ProfileBlockDuration,
25+
}
26+
27+
// Tracing flag constants declared for CLI use.
28+
const (
29+
FlagProfilingDSN = "profiling.dsn"
30+
FlagProfileUploadRate = "profiling.upload-rate"
31+
FlagProfilingTags = "profiling.tags"
32+
FlagProfilingTypes = "profiling.types"
33+
)
34+
35+
// ProfilingFlags are flags that configure profiling.
36+
var ProfilingFlags = Flags{
37+
&cli.StringFlag{
38+
Name: FlagProfilingDSN,
39+
Usage: "The address to the Pyroscope server, in the format " +
40+
"'http://basic:auth@server:port?token=auth-token&tenantid=tenant-id'.",
41+
EnvVars: []string{"PROFILING_DSN"},
42+
},
43+
&cli.DurationFlag{
44+
Name: FlagProfileUploadRate,
45+
Usage: "The rate at which profiles are uploaded.",
46+
Value: 15 * time.Second,
47+
EnvVars: []string{"PROFILING_UPLOAD_RATE"},
48+
},
49+
&cli.StringSliceFlag{
50+
Name: FlagProfilingTags,
51+
Usage: "A list of tags appended to every profile. Format: key=value.",
52+
EnvVars: []string{"PROFILING_TAGS"},
53+
},
54+
&cli.StringSliceFlag{
55+
Name: FlagProfilingTypes,
56+
Usage: "The type of profiles to include. Defaults to all.",
57+
EnvVars: []string{"PROFILING_TYPES"},
58+
},
59+
}
60+
61+
// NewProfiler returns a profiler configured from the cli.
62+
// If no profiler is configured, nil is returned.
63+
func NewProfiler(c *cli.Context, svc string, log *logger.Logger) (*pyroscope.Profiler, error) {
64+
dsn := c.String(FlagProfilingDSN)
65+
if dsn == "" {
66+
//nolint:nilnil // There is no sentinel in this case.
67+
return nil, nil
68+
}
69+
70+
u, err := url.Parse(dsn)
71+
if err != nil {
72+
return nil, fmt.Errorf("parsing profiling DSN: %w", err)
73+
}
74+
75+
tenantID := u.Query().Get("tenantid")
76+
77+
authToken := u.Query().Get("token")
78+
var username, password string
79+
if u.User != nil {
80+
username = u.User.Username()
81+
password, _ = u.User.Password()
82+
}
83+
if (username != "" || password != "") && authToken != "" {
84+
return nil, errors.New("cannot set auth token and basic auth")
85+
}
86+
87+
srvURL := &url.URL{
88+
Scheme: u.Scheme,
89+
Host: u.Host,
90+
Path: u.Path,
91+
}
92+
93+
tags := map[string]string{}
94+
if pairs := c.StringSlice(FlagProfilingTags); len(pairs) > 0 {
95+
strTags, err := Split(pairs, "=")
96+
if err != nil {
97+
return nil, err
98+
}
99+
for _, kv := range strTags {
100+
tags[kv[0]] = kv[1]
101+
}
102+
}
103+
104+
types := allProfilingTypes
105+
if newTypes := c.StringSlice(FlagProfilingTypes); len(newTypes) > 0 {
106+
types = make([]pyroscope.ProfileType, len(newTypes))
107+
for i, typ := range newTypes {
108+
types[i] = pyroscope.ProfileType(typ)
109+
}
110+
}
111+
112+
cfg := pyroscope.Config{
113+
ApplicationName: svc,
114+
Tags: tags,
115+
ServerAddress: srvURL.String(),
116+
AuthToken: authToken,
117+
BasicAuthUser: username,
118+
BasicAuthPassword: password,
119+
TenantID: tenantID,
120+
UploadRate: c.Duration(FlagProfileUploadRate),
121+
Logger: pyroLogAdapter{log: log},
122+
ProfileTypes: types,
123+
}
124+
125+
return pyroscope.Start(cfg)
126+
}
127+
128+
type pyroLogAdapter struct {
129+
log *logger.Logger
130+
}
131+
132+
func (a pyroLogAdapter) Infof(format string, args ...any) {
133+
a.log.Info(fmt.Sprintf(format, args...))
134+
}
135+
136+
func (a pyroLogAdapter) Debugf(format string, args ...any) {
137+
a.log.Debug(fmt.Sprintf(format, args...))
138+
}
139+
140+
func (a pyroLogAdapter) Errorf(format string, args ...any) {
141+
a.log.Error(fmt.Sprintf(format, args...))
142+
}

0 commit comments

Comments
 (0)