Skip to content

Commit

Permalink
github receive audit logs initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
justinianvoss22 committed Sep 12, 2024
1 parent 9ae1a0f commit 6b4e7a2
Show file tree
Hide file tree
Showing 21 changed files with 12,227 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ If you are looking for developer-facing changes, check out [CHANGELOG-API.md](./
Adds the ability to tune the minumum, default and maximum fetch sizes for the Kafka Receiver
- `solarwindsapmsettingsextension`: Added logic for refresh function (#27668)
- `githubreceiver`: Promote GitHub receiver metrics to alpha status. (#34960)
- `githubreceiver`: Add audit log implementation for GitHub Receiver to support user, organization, or enterprise logs. (#35015)
- `googlecloudmonitoringreceiver`: Enhancing the Google Cloud monitoring receiver to establish a client connection, scrape GCP Cloud Metrics, and transform them into an OpenTelemetry compatible format for pipeline processing. (#33762)
- Implements client connection to Google Cloud Monitoring API.
- Scrapes timeseries data based on configured metrics.
Expand Down
21 changes: 21 additions & 0 deletions receiver/githubreceiver/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ package githubreceiver // import "github.com/open-telemetry/opentelemetry-collec
import (
"errors"
"fmt"
"time"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configopaque"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/receiver/scraperhelper"

Expand All @@ -24,6 +26,10 @@ type Config struct {
scraperhelper.ControllerConfig `mapstructure:",squash"`
Scrapers map[string]internal.Config `mapstructure:"scrapers"`
metadata.MetricsBuilderConfig `mapstructure:",squash"`
AccessToken configopaque.String `mapstructure:"access_token"`
LogType string `mapstructure:"log_type"` // "user", "organization", or "enterprise"
Name string `mapstructure:"name"` // The name of the user, organization, or enterprise
PollInterval time.Duration `mapstructure:"poll_interval,omitempty"` // The interval at which to poll the GitHub API
}

var _ component.Config = (*Config)(nil)
Expand All @@ -34,6 +40,21 @@ func (cfg *Config) Validate() error {
if len(cfg.Scrapers) == 0 {
return errors.New("must specify at least one scraper")
}
if cfg.AccessToken == "" {
return fmt.Errorf("missing access_token; required")
}
if cfg.LogType == "" {
return fmt.Errorf("missing log_type; required")
}
if cfg.Name == "" {
return fmt.Errorf("missing name; required")
}
if cfg.PollInterval == 0 {
return fmt.Errorf("missing poll_interval; required")
}
if cfg.PollInterval < time.Duration(float64(time.Second)*0.72) {
return fmt.Errorf("invalid poll_interval; must be at least 0.72 seconds")
}
return nil
}

Expand Down
152 changes: 152 additions & 0 deletions receiver/githubreceiver/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ func TestLoadConfig(t *testing.T) {
defaultConfigGitHubScraper.(*Config).Scrapers = map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
}
defaultConfigGitHubScraper.(*Config).AccessToken = "my_token"
defaultConfigGitHubScraper.(*Config).LogType = "user"
defaultConfigGitHubScraper.(*Config).Name = "github"
defaultConfigGitHubScraper.(*Config).PollInterval = 60 * time.Second

assert.Equal(t, defaultConfigGitHubScraper, r0)

Expand All @@ -52,6 +56,10 @@ func TestLoadConfig(t *testing.T) {
Scrapers: map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
},
AccessToken: "my_token",
LogType: "user",
Name: "github",
PollInterval: time.Second * 60,
}

assert.Equal(t, expectedConfig, r1)
Expand Down Expand Up @@ -120,3 +128,147 @@ func TestConfig_Unmarshal(t *testing.T) {
})
}
}

func TestValidate(t *testing.T) {
testCases := []struct {
desc string
errExpected bool
errText string
config Config
}{
{
desc: "pass simple",
errExpected: false,
config: Config{
ControllerConfig: scraperhelper.ControllerConfig{
CollectionInterval: 30 * time.Second,
InitialDelay: 1 * time.Second,
},
Scrapers: map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
},
AccessToken: "AccessToken",
LogType: "user",
Name: "testName",
PollInterval: 60 * time.Second,
},
},
{
desc: "fail no access token",
errExpected: true,
errText: "missing access_token; required",
config: Config{
ControllerConfig: scraperhelper.ControllerConfig{
CollectionInterval: 30 * time.Second,
InitialDelay: 1 * time.Second,
},
Scrapers: map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
},
LogType: "user",
Name: "testName",
PollInterval: 60 * time.Second,
},
},
{
desc: "fail no log type",
errExpected: true,
errText: "missing log_type; required",
config: Config{
ControllerConfig: scraperhelper.ControllerConfig{
CollectionInterval: 30 * time.Second,
InitialDelay: 1 * time.Second,
},
Scrapers: map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
},
AccessToken: "AccessToken",
Name: "testName",
PollInterval: 60 * time.Second,
},
},
{
desc: "fail no name",
errExpected: true,
errText: "missing name; required",
config: Config{
ControllerConfig: scraperhelper.ControllerConfig{
CollectionInterval: 30 * time.Second,
InitialDelay: 1 * time.Second,
},
Scrapers: map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
},
AccessToken: "AccessToken",
LogType: "user",
PollInterval: 60 * time.Second,
},
},
{
desc: "fail no name",
errExpected: true,
errText: "missing name; required",
config: Config{
ControllerConfig: scraperhelper.ControllerConfig{
CollectionInterval: 30 * time.Second,
InitialDelay: 1 * time.Second,
},
Scrapers: map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
},
AccessToken: "AccessToken",
LogType: "user",
PollInterval: 60 * time.Second,
},
},
{
desc: "fail with no poll interval",
errExpected: true,
errText: "missing poll_interval; required",
config: Config{
ControllerConfig: scraperhelper.ControllerConfig{
CollectionInterval: 30 * time.Second,
InitialDelay: 1 * time.Second,
},
Scrapers: map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
},
AccessToken: "AccessToken",
LogType: "user",
Name: "testName",
},
},
{
desc: "fail invalid poll interval short",
errExpected: true,
errText: "invalid poll_interval; must be at least 0.72 seconds",
config: Config{
ControllerConfig: scraperhelper.ControllerConfig{
CollectionInterval: 30 * time.Second,
InitialDelay: 1 * time.Second,
},
Scrapers: map[string]internal.Config{
metadata.Type.String(): (&githubscraper.Factory{}).CreateDefaultConfig(),
},
AccessToken: "AccessToken",
LogType: "user",
Name: "testName",
PollInterval: 700 * time.Millisecond,
},
},
}

for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {

err := component.ValidateConfig(tc.config)

if tc.errExpected {
require.EqualError(t, err, tc.errText)
return
}

require.NoError(t, err)
})
}
}
19 changes: 19 additions & 0 deletions receiver/githubreceiver/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"context"
"errors"
"fmt"
"time"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
Expand Down Expand Up @@ -34,6 +35,7 @@ func NewFactory() receiver.Factory {
metadata.Type,
createDefaultConfig,
receiver.WithMetrics(createMetricsReceiver, metadata.MetricsStability),
receiver.WithLogs(createLogsReceiver, metadata.LogsStability),
)
}

Expand All @@ -56,6 +58,7 @@ func createDefaultConfig() component.Config {
// TODO: aqp completely remove these comments if the metrics build config
// needs to be defined in each scraper
// MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
PollInterval: time.Second * 60,
}
}

Expand Down Expand Up @@ -87,6 +90,22 @@ func createMetricsReceiver(
)
}

// Create the logs receiver according to the OTEL conventions taking in the
// context, receiver params, configuration from the component, and consumer (process or exporter)
func createLogsReceiver(
_ context.Context,
params receiver.Settings,
rConf component.Config,
consumer consumer.Logs,
) (receiver.Logs, error) {
cfg := rConf.(*Config)
rcvr, err := newGitHubLogsReceiver(cfg, params.Logger, consumer)
if err != nil {
return nil, fmt.Errorf("unable to create an log receiver instance: %w", err)
}
return rcvr, nil
}

func createAddScraperOpts(
ctx context.Context,
params receiver.Settings,
Expand Down
12 changes: 10 additions & 2 deletions receiver/githubreceiver/factory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ import (
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/receiver/receivertest"

"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/githubreceiver/internal"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/githubreceiver/internal/metadata"
)

var creationSet = receivertest.NewNopSettings()
Expand All @@ -28,6 +30,12 @@ func TestCreateDefaultConfig(t *testing.T) {
assert.NoError(t, componenttest.CheckConfigStruct(cfg))
}

func TestType(t *testing.T) {
factory := NewFactory()
ft := factory.Type()
require.EqualValues(t, metadata.Type, ft)
}

func TestCreateReceiver(t *testing.T) {
factory := NewFactory()
cfg := factory.CreateDefaultConfig()
Expand All @@ -41,8 +49,8 @@ func TestCreateReceiver(t *testing.T) {
assert.NotNil(t, mReceiver)

tLogs, err := factory.CreateLogsReceiver(context.Background(), creationSet, cfg, consumertest.NewNop())
assert.Equal(t, err, component.ErrDataTypeIsNotSupported)
assert.Nil(t, tLogs)
assert.NoError(t, err)
assert.NotNil(t, tLogs)
}

func TestCreateReceiver_ScraperKeyConfigError(t *testing.T) {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 6b4e7a2

Please sign in to comment.