Skip to content

Commit 1f2b7b8

Browse files
committed
OtelCol Receiver Github
1 parent 5f9aeec commit 1f2b7b8

File tree

3 files changed

+238
-0
lines changed

3 files changed

+238
-0
lines changed

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,6 +1077,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
10771077
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
10781078
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
10791079
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
1080+
github.com/google/go-github/v75 v75.0.0 h1:k7q8Bvg+W5KxRl9Tjq16a9XEgVY1pwuiG5sIL7435Ic=
1081+
github.com/google/go-github/v75 v75.0.0/go.mod h1:H3LUJEA1TCrzuUqtdAQniBNwuKiQIqdGKgBo1/M/uqI=
10801082
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
10811083
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
10821084
github.com/google/go-tpm v0.9.6 h1:Ku42PT4LmjDu1H5C5ISWLlpI1mj+Zq7sPGKoRw2XROA=
@@ -2347,6 +2349,8 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr
23472349
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
23482350
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
23492351
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
2352+
github.com/vektah/gqlparser/v2 v2.5.22 h1:yaaeJ0fu+nv1vUMW0Hl+aS1eiv1vMfapBNjpffAda1I=
2353+
github.com/vektah/gqlparser/v2 v2.5.22/go.mod h1:xMl+ta8a5M1Yo1A1Iwt/k7gSpscwSnHZdw7tfhEGfTM=
23502354
github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw=
23512355
github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4=
23522356
github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI=
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package github
2+
3+
import (
4+
"errors"
5+
"time"
6+
"unsafe"
7+
8+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/githubreceiver"
9+
10+
"go.opentelemetry.io/collector/scraper/scraperhelper"
11+
)
12+
13+
type GithubConfig struct {
14+
InitialDelay time.Duration `alloy:"initial_delay,attr,optional"`
15+
CollectionInterval time.Duration `alloy:"collection_interval,attr,optional"`
16+
Scrapers map[string]ScraperConfig `alloy:"scraper,block"`
17+
}
18+
19+
func (args GithubConfig) Convert() githubreceiver.Config {
20+
convertedScrapers := make(map[string]interface{}, len(args.Scrapers))
21+
for name, scraper := range args.Scrapers {
22+
convertedScrapers[name] = scraper.Convert()
23+
}
24+
25+
config := githubreceiver.Config{
26+
ControllerConfig: scraperhelper.ControllerConfig{
27+
InitialDelay: args.InitialDelay,
28+
CollectionInterval: args.CollectionInterval,
29+
},
30+
}
31+
32+
*(*map[string]interface{})(unsafe.Pointer(&config.Scrapers)) = convertedScrapers
33+
34+
return config
35+
}
36+
37+
func (args *GithubConfig) SetToDefault() {
38+
if args.InitialDelay == 0 {
39+
args.InitialDelay = 0
40+
}
41+
if args.CollectionInterval == 0 {
42+
args.CollectionInterval = 60 * time.Second
43+
}
44+
45+
for _, scraper := range args.Scrapers {
46+
scraper.SetToDefault()
47+
}
48+
}
49+
50+
func (args GithubConfig) Validate() error {
51+
for _, scraper := range args.Scrapers {
52+
if err := scraper.Validate(); err != nil {
53+
return err
54+
}
55+
}
56+
57+
return nil
58+
}
59+
60+
type ScraperConfig struct {
61+
GithubOrg string `alloy:"github_org,attr"`
62+
SearchQuery string `alloy:"search_query,attr"`
63+
Endpoint string `alloy:"endpoint,attr,optional"`
64+
Auth AuthConfig `alloy:"auth,block"`
65+
Metrics MetricsConfig `alloy:"metrics,block,optional"`
66+
}
67+
68+
func (sc ScraperConfig) Convert() map[string]interface{} {
69+
return map[string]interface{}{
70+
"github_org": sc.GithubOrg,
71+
"search_query": sc.SearchQuery,
72+
"endpoint": sc.Endpoint,
73+
"auth": sc.Auth.Convert(),
74+
"metrics": sc.Metrics.Convert(),
75+
}
76+
}
77+
78+
func (sc *ScraperConfig) SetToDefault() {
79+
if sc.Metrics == (MetricsConfig{}) {
80+
sc.Metrics.SetToDefault()
81+
}
82+
}
83+
84+
func (sc *ScraperConfig) Validate() error {
85+
if sc.GithubOrg == "" {
86+
return errors.New("github_org is required")
87+
}
88+
return nil
89+
}
90+
91+
type AuthConfig struct {
92+
Authenticator string `alloy:"authenticator,attr"`
93+
}
94+
95+
func (ac AuthConfig) Convert() map[string]interface{} {
96+
return map[string]interface{}{
97+
"authenticator": ac.Authenticator,
98+
}
99+
}
100+
101+
type MetricConfig struct {
102+
Enabled bool `alloy:"enabled,attr"`
103+
}
104+
105+
type MetricsConfig struct {
106+
VCSChangeCount MetricConfig `alloy:"vcs.change.count,block,optional"`
107+
VCSChangeDuration MetricConfig `alloy:"vcs.change.duration,block,optional"`
108+
VCSChangeTimeToApproval MetricConfig `alloy:"vcs.change.time_to_approval,block,optional"`
109+
VCSChangeTimeToMerge MetricConfig `alloy:"vcs.change.time_to_merge,block,optional"`
110+
VCSRefCount MetricConfig `alloy:"vcs.ref.count,block,optional"`
111+
VCSRefLinesDelta MetricConfig `alloy:"vcs.ref.lines_delta,block,optional"`
112+
VCSRefRevisionsDelta MetricConfig `alloy:"vcs.ref.revisions_delta,block,optional"`
113+
VCSRefTime MetricConfig `alloy:"vcs.ref.time,block,optional"`
114+
VCSRepositoryCount MetricConfig `alloy:"vcs.repository.count,block,optional"`
115+
VCSContributorCount MetricConfig `alloy:"vcs.contributor.count,block,optional"`
116+
}
117+
118+
func (m *MetricsConfig) Convert() map[string]interface{} {
119+
if m == nil {
120+
return nil
121+
}
122+
123+
return map[string]interface{}{
124+
"vcs.change.count": m.VCSChangeCount.Convert(),
125+
"vcs.change.duration": m.VCSChangeDuration.Convert(),
126+
"vcs.change.time_to_approval": m.VCSChangeTimeToApproval.Convert(),
127+
"vcs.change.time_to_merge": m.VCSChangeTimeToMerge.Convert(),
128+
"vcs.ref.count": m.VCSRefCount.Convert(),
129+
"vcs.ref.lines_delta": m.VCSRefLinesDelta.Convert(),
130+
"vcs.ref.revisions_delta": m.VCSRefRevisionsDelta.Convert(),
131+
"vcs.ref.time": m.VCSRefTime.Convert(),
132+
"vcs.repository.count": m.VCSRepositoryCount.Convert(),
133+
"vcs.contributor.count": m.VCSContributorCount.Convert(),
134+
}
135+
}
136+
137+
func (m *MetricConfig) Convert() map[string]interface{} {
138+
if m == nil {
139+
return nil
140+
}
141+
142+
return map[string]interface{}{
143+
"enabled": m.Enabled,
144+
}
145+
}
146+
147+
func (mc *MetricsConfig) SetToDefault() {
148+
*mc = MetricsConfig{
149+
VCSChangeCount: MetricConfig{Enabled: true},
150+
VCSChangeDuration: MetricConfig{Enabled: true},
151+
VCSChangeTimeToApproval: MetricConfig{Enabled: true},
152+
VCSChangeTimeToMerge: MetricConfig{Enabled: true},
153+
VCSRefCount: MetricConfig{Enabled: true},
154+
VCSRefLinesDelta: MetricConfig{Enabled: true},
155+
VCSRefRevisionsDelta: MetricConfig{Enabled: true},
156+
VCSRefTime: MetricConfig{Enabled: true},
157+
VCSRepositoryCount: MetricConfig{Enabled: true},
158+
VCSContributorCount: MetricConfig{Enabled: false},
159+
}
160+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package github
2+
3+
import (
4+
"github.com/grafana/alloy/internal/component"
5+
"github.com/grafana/alloy/internal/component/otelcol"
6+
otelcolCfg "github.com/grafana/alloy/internal/component/otelcol/config"
7+
"github.com/grafana/alloy/internal/component/otelcol/extension"
8+
"github.com/grafana/alloy/internal/component/otelcol/receiver"
9+
"github.com/grafana/alloy/internal/featuregate"
10+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/githubreceiver"
11+
otelcomponent "go.opentelemetry.io/collector/component"
12+
"go.opentelemetry.io/collector/pipeline"
13+
)
14+
15+
func init() {
16+
component.Register(component.Registration{
17+
Name: "otelcol.receiver.github",
18+
Stability: featuregate.StabilityExperimental,
19+
Args: Arguments{},
20+
21+
Build: func(opts component.Options, args component.Arguments) (component.Component, error) {
22+
fact := githubreceiver.NewFactory()
23+
return receiver.New(opts, fact, args.(Arguments))
24+
},
25+
})
26+
}
27+
28+
// Arguments configures the otelcol.receiver.github component.
29+
type Arguments struct {
30+
Github GithubConfig `alloy:"github,block,optional"`
31+
Storage *extension.ExtensionHandler `alloy:"storage,attr,optional"`
32+
33+
DebugMetrics otelcolCfg.DebugMetricsArguments `alloy:"debug_metrics,block,optional"`
34+
35+
// Output configures where to send received data. Required.
36+
Output *otelcol.ConsumerArguments `alloy:"output,block"`
37+
}
38+
39+
var _ receiver.Arguments = Arguments{}
40+
41+
func (args *Arguments) Validate() error {
42+
return args.Github.Validate()
43+
}
44+
45+
func (args *Arguments) SetToDefault() {
46+
args.Github.SetToDefault()
47+
}
48+
49+
func (args Arguments) Convert() (otelcomponent.Config, error) {
50+
return &githubreceiver.Config{
51+
ControllerConfig: args.Github.Convert().ControllerConfig,
52+
Scrapers: args.Github.Convert().Scrapers,
53+
}, nil
54+
}
55+
56+
// Extensions implements receiver.Arguments.
57+
func (args Arguments) Extensions() map[otelcomponent.ID]otelcomponent.Component {
58+
return nil
59+
}
60+
61+
// Exporters implements receiver.Arguments.
62+
func (args Arguments) Exporters() map[pipeline.Signal]map[otelcomponent.ID]otelcomponent.Component {
63+
return nil
64+
}
65+
66+
// NextConsumers implements receiver.Arguments.
67+
func (args Arguments) NextConsumers() *otelcol.ConsumerArguments {
68+
return args.Output
69+
}
70+
71+
// DebugMetricsConfig implements receiver.Arguments.
72+
func (args Arguments) DebugMetricsConfig() otelcolCfg.DebugMetricsArguments {
73+
return args.DebugMetrics
74+
}

0 commit comments

Comments
 (0)