Skip to content

Commit 67507f0

Browse files
authored
Merge branch 'main' into scrape_config_probe_selector
2 parents 5bca0ff + 3d254a4 commit 67507f0

File tree

6 files changed

+104
-57
lines changed

6 files changed

+104
-57
lines changed

.chloggen/auto_instr_node_up.yaml

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: enhancement
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: auto-instrumentation
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: updated node auto-instrumentation dependencies to the latest version
9+
10+
# One or more tracking issues related to the change
11+
issues: [3476]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext: |
17+
auto-instrumentations-node to 0.53.0
18+
exporter-metrics-otlp-grpc to 0.55.0
19+
exporter-prometheus to 0.55.0

autoinstrumentation/nodejs/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
"typescript": "^5.6.3"
1515
},
1616
"dependencies": {
17-
"@opentelemetry/auto-instrumentations-node": "0.52.1",
18-
"@opentelemetry/exporter-metrics-otlp-grpc": "0.54.0",
19-
"@opentelemetry/exporter-prometheus": "0.54.0"
17+
"@opentelemetry/exporter-metrics-otlp-grpc": "0.55.0",
18+
"@opentelemetry/auto-instrumentations-node": "0.53.0",
19+
"@opentelemetry/exporter-prometheus": "0.55.0"
2020
}
2121
}

controllers/builder_test.go

+41-27
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package controllers
1616

1717
import (
18-
"strings"
1918
"testing"
2019

2120
cmv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
@@ -1245,7 +1244,7 @@ service:
12451244
name string
12461245
args args
12471246
want []client.Object
1248-
featuregates []string
1247+
featuregates []*colfeaturegate.Gate
12491248
wantErr bool
12501249
opts []config.Option
12511250
}{
@@ -2192,8 +2191,7 @@ prometheus_cr:
21922191
},
21932192
},
21942193
},
2195-
wantErr: false,
2196-
featuregates: []string{},
2194+
wantErr: false,
21972195
},
21982196
{
21992197
name: "target allocator mtls enabled",
@@ -2833,7 +2831,7 @@ prometheus_cr:
28332831
opts: []config.Option{
28342832
config.WithCertManagerAvailability(certmanager.Available),
28352833
},
2836-
featuregates: []string{"operator.targetallocator.mtls"},
2834+
featuregates: []*colfeaturegate.Gate{featuregate.EnableTargetAllocatorMTLS},
28372835
},
28382836
}
28392837
for _, tt := range tests {
@@ -2854,13 +2852,18 @@ prometheus_cr:
28542852
targetAllocator, err := collector.TargetAllocator(params)
28552853
require.NoError(t, err)
28562854
params.TargetAllocator = targetAllocator
2857-
if len(tt.featuregates) > 0 {
2858-
fg := strings.Join(tt.featuregates, ",")
2859-
flagset := featuregate.Flags(colfeaturegate.GlobalRegistry())
2860-
if err = flagset.Set(featuregate.FeatureGatesFlag, fg); err != nil {
2861-
t.Errorf("featuregate setting error = %v", err)
2855+
registry := colfeaturegate.GlobalRegistry()
2856+
for _, gate := range tt.featuregates {
2857+
current := gate.IsEnabled()
2858+
require.False(t, current, "only enable gates which are disabled by default")
2859+
if setErr := registry.Set(gate.ID(), true); setErr != nil {
2860+
require.NoError(t, setErr)
28622861
return
28632862
}
2863+
t.Cleanup(func() {
2864+
setErr := registry.Set(gate.ID(), current)
2865+
require.NoError(t, setErr)
2866+
})
28642867
}
28652868
got, err := BuildCollector(params)
28662869
if (err != nil) != tt.wantErr {
@@ -2915,7 +2918,7 @@ service:
29152918
name string
29162919
args args
29172920
want []client.Object
2918-
featuregates []string
2921+
featuregates []*colfeaturegate.Gate
29192922
wantErr bool
29202923
opts []config.Option
29212924
}{
@@ -3402,7 +3405,7 @@ service:
34023405
},
34033406
},
34043407
wantErr: false,
3405-
featuregates: []string{},
3408+
featuregates: []*colfeaturegate.Gate{},
34063409
},
34073410
}
34083411
for _, tt := range tests {
@@ -3423,13 +3426,20 @@ service:
34233426
targetAllocator, err := collector.TargetAllocator(params)
34243427
require.NoError(t, err)
34253428
params.TargetAllocator = targetAllocator
3426-
featuregates := []string{"operator.collector.targetallocatorcr"}
3429+
featuregates := []*colfeaturegate.Gate{featuregate.CollectorUsesTargetAllocatorCR}
34273430
featuregates = append(featuregates, tt.featuregates...)
3428-
fg := strings.Join(featuregates, ",")
3429-
flagset := featuregate.Flags(colfeaturegate.GlobalRegistry())
3430-
if err = flagset.Set(featuregate.FeatureGatesFlag, fg); err != nil {
3431-
t.Errorf("featuregate setting error = %v", err)
3432-
return
3431+
registry := colfeaturegate.GlobalRegistry()
3432+
for _, gate := range featuregates {
3433+
current := gate.IsEnabled()
3434+
require.False(t, current, "only enable gates which are disabled by default")
3435+
if setErr := registry.Set(gate.ID(), true); setErr != nil {
3436+
require.NoError(t, setErr)
3437+
return
3438+
}
3439+
t.Cleanup(func() {
3440+
setErr := registry.Set(gate.ID(), current)
3441+
require.NoError(t, setErr)
3442+
})
34333443
}
34343444
got, err := BuildCollector(params)
34353445
if (err != nil) != tt.wantErr {
@@ -3451,7 +3461,7 @@ func TestBuildTargetAllocator(t *testing.T) {
34513461
name string
34523462
args args
34533463
want []client.Object
3454-
featuregates []string
3464+
featuregates []*colfeaturegate.Gate
34553465
wantErr bool
34563466
opts []config.Option
34573467
}{
@@ -4029,8 +4039,7 @@ prometheus_cr:
40294039
},
40304040
},
40314041
},
4032-
wantErr: false,
4033-
featuregates: []string{},
4042+
wantErr: false,
40344043
},
40354044
{
40364045
name: "collector present",
@@ -4790,7 +4799,7 @@ prometheus_cr:
47904799
opts: []config.Option{
47914800
config.WithCertManagerAvailability(certmanager.Available),
47924801
},
4793-
featuregates: []string{"operator.targetallocator.mtls"},
4802+
featuregates: []*colfeaturegate.Gate{featuregate.EnableTargetAllocatorMTLS},
47944803
},
47954804
}
47964805
for _, tt := range tests {
@@ -4809,13 +4818,18 @@ prometheus_cr:
48094818
TargetAllocator: tt.args.instance,
48104819
Collector: tt.args.collector,
48114820
}
4812-
if len(tt.featuregates) > 0 {
4813-
fg := strings.Join(tt.featuregates, ",")
4814-
flagset := featuregate.Flags(colfeaturegate.GlobalRegistry())
4815-
if err := flagset.Set(featuregate.FeatureGatesFlag, fg); err != nil {
4816-
t.Errorf("featuregate setting error = %v", err)
4821+
registry := colfeaturegate.GlobalRegistry()
4822+
for _, gate := range tt.featuregates {
4823+
current := gate.IsEnabled()
4824+
require.False(t, current, "only enable gates which are disabled by default")
4825+
if err := registry.Set(gate.ID(), true); err != nil {
4826+
require.NoError(t, err)
48174827
return
48184828
}
4829+
t.Cleanup(func() {
4830+
err := registry.Set(gate.ID(), current)
4831+
require.NoError(t, err)
4832+
})
48194833
}
48204834
got, err := BuildTargetAllocator(params)
48214835
if (err != nil) != tt.wantErr {

controllers/reconcile_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
routev1 "github.com/openshift/api/route/v1"
2323
"github.com/stretchr/testify/assert"
2424
"github.com/stretchr/testify/require"
25+
colfeaturegate "go.opentelemetry.io/collector/featuregate"
2526
appsv1 "k8s.io/api/apps/v1"
2627
autoscalingv2 "k8s.io/api/autoscaling/v2"
2728
v1 "k8s.io/api/core/v1"
@@ -48,6 +49,7 @@ import (
4849
"github.com/open-telemetry/opentelemetry-operator/internal/config"
4950
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
5051
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
52+
"github.com/open-telemetry/opentelemetry-operator/pkg/featuregate"
5153
)
5254

5355
const (
@@ -74,6 +76,18 @@ var (
7476
type check[T any] func(t *testing.T, params T)
7577

7678
func TestOpenTelemetryCollectorReconciler_Reconcile(t *testing.T) {
79+
// enable the collector CR feature flag, as these tests assume it
80+
// TODO: drop this after the flag is enabled by default
81+
registry := colfeaturegate.GlobalRegistry()
82+
current := featuregate.CollectorUsesTargetAllocatorCR.IsEnabled()
83+
require.False(t, current, "don't set gates which are enabled by default")
84+
err := registry.Set(featuregate.CollectorUsesTargetAllocatorCR.ID(), true)
85+
require.NoError(t, err)
86+
t.Cleanup(func() {
87+
err := registry.Set(featuregate.CollectorUsesTargetAllocatorCR.ID(), current)
88+
require.NoError(t, err)
89+
})
90+
7791
addedMetadataDeployment := testCollectorWithMode("test-deployment", v1alpha1.ModeDeployment)
7892
addedMetadataDeployment.Labels = map[string]string{
7993
labelName: labelVal,

go.mod

+9-9
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ retract v1.51.0
66

77
require (
88
dario.cat/mergo v1.0.1
9-
github.com/Masterminds/semver/v3 v3.3.0
9+
github.com/Masterminds/semver/v3 v3.3.1
1010
github.com/blang/semver/v4 v4.0.0
1111
github.com/buraksezer/consistent v0.10.0
1212
github.com/cespare/xxhash/v2 v2.3.0
@@ -31,7 +31,7 @@ require (
3131
github.com/shirou/gopsutil v3.21.11+incompatible
3232
github.com/spf13/pflag v1.0.5
3333
github.com/stretchr/testify v1.9.0
34-
go.opentelemetry.io/collector/featuregate v1.19.0
34+
go.opentelemetry.io/collector/featuregate v1.20.0
3535
go.opentelemetry.io/otel v1.32.0
3636
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0
3737
go.opentelemetry.io/otel/exporters/prometheus v0.54.0
@@ -42,15 +42,15 @@ require (
4242
go.uber.org/zap v1.27.0
4343
gopkg.in/yaml.v2 v2.4.0
4444
gopkg.in/yaml.v3 v3.0.1
45-
k8s.io/api v0.31.2
46-
k8s.io/apiextensions-apiserver v0.31.2
47-
k8s.io/apimachinery v0.31.2
48-
k8s.io/client-go v0.31.2
49-
k8s.io/component-base v0.31.2
45+
k8s.io/api v0.31.3
46+
k8s.io/apiextensions-apiserver v0.31.3
47+
k8s.io/apimachinery v0.31.3
48+
k8s.io/client-go v0.31.3
49+
k8s.io/component-base v0.31.3
5050
k8s.io/klog/v2 v2.130.1
51-
k8s.io/kubectl v0.31.2
51+
k8s.io/kubectl v0.31.3
5252
k8s.io/utils v0.0.0-20240921022957-49e7df575cb6
53-
sigs.k8s.io/controller-runtime v0.19.1
53+
sigs.k8s.io/controller-runtime v0.19.2
5454
sigs.k8s.io/gateway-api v1.1.0 // indirect
5555
sigs.k8s.io/yaml v1.4.0
5656
)

go.sum

+18-18
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U
6363
github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4=
6464
github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
6565
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
66-
github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
67-
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
66+
github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
67+
github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
6868
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
6969
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
7070
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -646,8 +646,8 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
646646
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
647647
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
648648
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
649-
go.opentelemetry.io/collector/featuregate v1.19.0 h1:ASea2sU+tdpKI3RxIJC/pufDAfwAmrvcQ4EmTHVu0B0=
650-
go.opentelemetry.io/collector/featuregate v1.19.0/go.mod h1:47xrISO71vJ83LSMm8+yIDsUbKktUp48Ovt7RR6VbRs=
649+
go.opentelemetry.io/collector/featuregate v1.20.0 h1:Mi7nMy/q52eruI+6jWnMKUOeM55XvwoPnGcdB1++O8c=
650+
go.opentelemetry.io/collector/featuregate v1.20.0/go.mod h1:47xrISO71vJ83LSMm8+yIDsUbKktUp48Ovt7RR6VbRs=
651651
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
652652
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
653653
go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
@@ -1055,31 +1055,31 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
10551055
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
10561056
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
10571057
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
1058-
k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0=
1059-
k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk=
1060-
k8s.io/apiextensions-apiserver v0.31.2 h1:W8EwUb8+WXBLu56ser5IudT2cOho0gAKeTOnywBLxd0=
1061-
k8s.io/apiextensions-apiserver v0.31.2/go.mod h1:i+Geh+nGCJEGiCGR3MlBDkS7koHIIKWVfWeRFiOsUcM=
1062-
k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw=
1063-
k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
1064-
k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc=
1065-
k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs=
1066-
k8s.io/component-base v0.31.2 h1:Z1J1LIaC0AV+nzcPRFqfK09af6bZ4D1nAOpWsy9owlA=
1067-
k8s.io/component-base v0.31.2/go.mod h1:9PeyyFN/drHjtJZMCTkSpQJS3U9OXORnHQqMLDz0sUQ=
1058+
k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8=
1059+
k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE=
1060+
k8s.io/apiextensions-apiserver v0.31.3 h1:+GFGj2qFiU7rGCsA5o+p/rul1OQIq6oYpQw4+u+nciE=
1061+
k8s.io/apiextensions-apiserver v0.31.3/go.mod h1:2DSpFhUZZJmn/cr/RweH1cEVVbzFw9YBu4T+U3mf1e4=
1062+
k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4=
1063+
k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
1064+
k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4=
1065+
k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs=
1066+
k8s.io/component-base v0.31.3 h1:DMCXXVx546Rfvhj+3cOm2EUxhS+EyztH423j+8sOwhQ=
1067+
k8s.io/component-base v0.31.3/go.mod h1:xME6BHfUOafRgT0rGVBGl7TuSg8Z9/deT7qq6w7qjIU=
10681068
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
10691069
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
10701070
k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38 h1:1dWzkmJrrprYvjGwh9kEUxmcUV/CtNU8QM7h1FLWQOo=
10711071
k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA=
1072-
k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M=
1073-
k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM=
1072+
k8s.io/kubectl v0.31.3 h1:3r111pCjPsvnR98oLLxDMwAeM6OPGmPty6gSKaLTQes=
1073+
k8s.io/kubectl v0.31.3/go.mod h1:lhMECDCbJN8He12qcKqs2QfmVo9Pue30geovBVpH5fs=
10741074
k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 h1:MDF6h2H/h4tbzmtIKTuctcwZmY0tY9mD9fNT47QO6HI=
10751075
k8s.io/utils v0.0.0-20240921022957-49e7df575cb6/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
10761076
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
10771077
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
10781078
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
10791079
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
10801080
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
1081-
sigs.k8s.io/controller-runtime v0.19.1 h1:Son+Q40+Be3QWb+niBXAg2vFiYWolDjjRfO8hn/cxOk=
1082-
sigs.k8s.io/controller-runtime v0.19.1/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
1081+
sigs.k8s.io/controller-runtime v0.19.2 h1:3sPrF58XQEPzbE8T81TN6selQIMGbtYwuaJ6eDssDF8=
1082+
sigs.k8s.io/controller-runtime v0.19.2/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
10831083
sigs.k8s.io/gateway-api v1.1.0 h1:DsLDXCi6jR+Xz8/xd0Z1PYl2Pn0TyaFMOPPZIj4inDM=
10841084
sigs.k8s.io/gateway-api v1.1.0/go.mod h1:ZH4lHrL2sDi0FHZ9jjneb8kKnGzFWyrTya35sWUTrRs=
10851085
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=

0 commit comments

Comments
 (0)