Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build odigos sampling processor #1300

Merged
2 changes: 1 addition & 1 deletion .github/workflows/verify-collector-ocb.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.22"
go-version: "1.22.0"
- name: Generate collector with ocb
working-directory: ./collector
run: "make genodigoscol"
Expand Down
2 changes: 2 additions & 0 deletions collector/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ The following command downloads the `ocb` tool and builds the collector:
```bash
make genodigoscol
```
**Notes:**
- Run `make genodigoscol` using the go version specify in odigosotelcol/go.mod toolchain.

## Metadata Generation

Expand Down
2 changes: 2 additions & 0 deletions collector/builder-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ exporters:

processors:
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigosresourcenameprocessor v0.100.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigossamplingprocessor v0.100.0
- gomod: go.opentelemetry.io/collector/processor/batchprocessor v0.100.0
- gomod: go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.100.0
- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.100.0
Expand Down Expand Up @@ -104,5 +105,6 @@ connectors:

replaces:
- github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigosresourcenameprocessor => ../processors/odigosresourcenameprocessor
- github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigossamplingprocessor => ../processors/odigossamplingprocessor
- github.com/open-telemetry/opentelemetry-collector-contrib/odigos/exporter/azureblobstorageexporter => ../exporters/azureblobstorageexporter
- github.com/open-telemetry/opentelemetry-collector-contrib/odigos/exporter/googlecloudstorageexporter => ../exporters/googlecloudstorageexporter
2 changes: 2 additions & 0 deletions collector/odigosotelcol/components.go

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

5 changes: 4 additions & 1 deletion collector/odigosotelcol/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module odigos.io/opentelemetry-collector/cmd/odigosotelcol

go 1.21.0

toolchain go1.22.3
toolchain go1.22.0

require (
github.com/open-telemetry/opentelemetry-collector-contrib/connector/countconnector v0.100.0
Expand Down Expand Up @@ -57,6 +57,7 @@ require (
github.com/open-telemetry/opentelemetry-collector-contrib/odigos/exporter/azureblobstorageexporter v0.100.0
github.com/open-telemetry/opentelemetry-collector-contrib/odigos/exporter/googlecloudstorageexporter v0.100.0
github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigosresourcenameprocessor v0.100.0
github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigossamplingprocessor v0.100.0
github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.100.0
github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.100.0
github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.100.0
Expand Down Expand Up @@ -534,6 +535,8 @@ require (

replace github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigosresourcenameprocessor => ../processors/odigosresourcenameprocessor

replace github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigossamplingprocessor => ../processors/odigossamplingprocessor

replace github.com/open-telemetry/opentelemetry-collector-contrib/odigos/exporter/azureblobstorageexporter => ../exporters/azureblobstorageexporter

replace github.com/open-telemetry/opentelemetry-collector-contrib/odigos/exporter/googlecloudstorageexporter => ../exporters/googlecloudstorageexporter
Expand Down
1 change: 1 addition & 0 deletions collector/processors/odigossamplingprocessor/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include ../../Makefile.Common
36 changes: 36 additions & 0 deletions collector/processors/odigossamplingprocessor/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Odigos Sampling processor

This processor samples traces based on the following supported rules:

1. HTTP Latency Rule: This rule allows you to configure service, endpoint, and threshold. Traces with a duration less than the specified threshold will be deleted.


``` yaml
groupbytrace:
wait_duration: 10s
odigossampling:
rules:
- name: "http-latency-test"
type: "http_latency"
rule_details:
"threshold": 1050
"endpoint": "/buy"
"service": "frontend"
```
- threshold: The maximum allowable trace duration in milliseconds. Traces with a duration less than this value will be deleted.
- endpoint: The specific HTTP route to match for sampling. Only traces with this route will be considered.
tamirdavid1 marked this conversation as resolved.
Show resolved Hide resolved
- service: The name of the service for which the rule applies. Only traces from this service will be considered.


**Notes:**
- When using the `odigossampling` processor, it is mandatory to use the `groupbytrace` processor beforehand.
```
service:
pipelines:
traces:
receivers:
processors:
- groupbytrace
- odigossampling
exporters:
```
59 changes: 59 additions & 0 deletions collector/processors/odigossamplingprocessor/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package odigossamplingprocessor

import (
"errors"
"fmt"

"github.com/mitchellh/mapstructure"
"github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigossamplingprocessor/internal/sampling"
"go.opentelemetry.io/collector/component"
)

type Config struct {
Rules []Rule `mapstructure:"rules"`
}

var _ component.Config = (*Config)(nil)

func (cfg *Config) Validate() error {
for _, rule := range cfg.Rules {
if err := rule.Validate(); err != nil {
return err
}
}
return nil
}

type Rule struct {
Name string `mapstructure:"name"`
Type string `mapstructure:"type"`
RuleDetails interface{} `mapstructure:"rule_details"`
}

func (r *Rule) Validate() error {
if r.Name == "" {
return errors.New("rule name cannot be empty")
}
if r.Type == "" {
return errors.New("rule type cannot be empty")
}
if r.RuleDetails == nil {
return errors.New("rule details cannot be nil")
}

switch r.Type {
case "http_latency":
var details sampling.TraceLatencyRule
if err := mapstructure.Decode(r.RuleDetails, &details); err != nil {
return err
}
if err := details.Validate(); err != nil {
return err
}
r.RuleDetails = &details
default:
return fmt.Errorf("unknown rule type: %s", r.Type)
}

return nil
}
43 changes: 43 additions & 0 deletions collector/processors/odigossamplingprocessor/factory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package odigossamplingprocessor

import (
"context"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/processor"
"go.opentelemetry.io/collector/processor/processorhelper"
)

// NewFactory returns a new factory for the Resource processor.
func NewFactory() processor.Factory {
return processor.NewFactory(
component.MustNewType("odigossampling"),
createDefaultConfig,
processor.WithTraces(createTracesProcessor, component.StabilityLevelBeta),
)
}

func createDefaultConfig() component.Config {
return &Config{
Rules: []Rule{},
}
}

func createTracesProcessor(
ctx context.Context,
set processor.CreateSettings,
cfg component.Config,
nextConsumer consumer.Traces) (processor.Traces, error) {

proc := &samplingProcessor{logger: set.Logger, config: cfg.(*Config)}

return processorhelper.NewTracesProcessor(
ctx,
set,
cfg,
nextConsumer,
proc.processTraces,
processorhelper.WithCapabilities(consumer.Capabilities{MutatesData: true}),
)
}

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

53 changes: 53 additions & 0 deletions collector/processors/odigossamplingprocessor/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
module github.com/open-telemetry/opentelemetry-collector-contrib/odigos/processor/odigossamplingprocessor

go 1.20

require (
github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c
github.com/stretchr/testify v1.8.4
go.opentelemetry.io/collector/component v0.94.0
go.opentelemetry.io/collector/confmap v0.94.0
go.opentelemetry.io/collector/consumer v0.94.0
go.opentelemetry.io/collector/pdata v1.1.0
go.opentelemetry.io/collector/processor v0.94.0
go.opentelemetry.io/otel/metric v1.23.0
go.opentelemetry.io/otel/trace v1.23.0
go.uber.org/zap v1.26.0
)

require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/knadh/koanf v1.5.0 // indirect
github.com/knadh/koanf/v2 v2.0.2 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.18.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.46.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
go.opentelemetry.io/collector v0.94.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.94.0 // indirect
go.opentelemetry.io/otel v1.23.0 // indirect
go.opentelemetry.io/otel/exporters/prometheus v0.45.1 // indirect
go.opentelemetry.io/otel/sdk v1.23.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.23.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/net v0.20.0 // indirect
golang.org/x/sys v0.16.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect
google.golang.org/grpc v1.61.0 // indirect
google.golang.org/protobuf v1.32.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading
Loading