Skip to content
Closed
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
6aac7ae
config and limiter extension
jmacd Mar 20, 2025
2a1818d
config and middleware extension
jmacd Mar 20, 2025
b519182
add limiter skeleton
jmacd Mar 20, 2025
4434dac
add request limiter calls
jmacd Mar 21, 2025
25a385c
At the two locations where I have written @@@, I realize that I have …
jmacd Mar 21, 2025
8fe3941
split rate limiter, resource limiter
jmacd Mar 21, 2025
84838fc
todos
jmacd Mar 21, 2025
cdc6698
skeleton ratelimiterextension
jmacd Mar 21, 2025
88b203b
rate limiter outline
jmacd Mar 22, 2025
b602b18
HTTP client and server network bytes
jmacd Mar 24, 2025
cec3306
add limiter provider
jmacd Mar 24, 2025
060c756
Follow 17002
jmacd Mar 24, 2025
ee8dd47
Let rate limiter accept request resource-weighted limits
jmacd Mar 24, 2025
9369495
Merge branch 'main' of github.com:open-telemetry/opentelemetry-collec…
jmacd Mar 28, 2025
af51711
middleware config: more direct, extension naming more consistent
jmacd Mar 28, 2025
2c3a406
sketch grpc middleware
jmacd Mar 28, 2025
8ca49f0
extend confighttp and configgrpc
jmacd Mar 28, 2025
1fa405e
memory limiter
jmacd Mar 28, 2025
e125898
multi limiter provider
jmacd Mar 28, 2025
a6e6b17
OTLP receiver limiter
jmacd Mar 28, 2025
10cfbb3
add direct grpc limiter support (this could be a helper)
jmacd Mar 28, 2025
1f4a724
add direct http limiter support (this could be a helper)
jmacd Mar 28, 2025
ee0c2e0
merge
jmacd Apr 1, 2025
6d194a8
factor limiterhelper
jmacd Apr 1, 2025
9f66533
remove/rename
jmacd Apr 1, 2025
0e30a3a
Use non-nil ReleaseFunc everywhere
jmacd Apr 2, 2025
70296f0
Merge branch 'main' of github.com:open-telemetry/opentelemetry-collec…
jmacd Apr 14, 2025
a79da5f
Merge branch 'main' of github.com:jmacd/opentelemetry-collector into …
jmacd Apr 14, 2025
854108f
update from main
jmacd Apr 21, 2025
fb5b8b9
Merge branch 'main' of github.com:open-telemetry/opentelemetry-collec…
jmacd Apr 21, 2025
fc7ba55
hide the option and config, eliminate the limiterhelper.Consumer
jmacd Apr 21, 2025
ea8152a
wip
jmacd Apr 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions config/configlimiter/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include ../../Makefile.Common
53 changes: 53 additions & 0 deletions config/configlimiter/configlimiter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

// Package configlimiter implements the configuration settings to
// apply rate limiting on incoming requests, and allows
// components to configure rate limiting behavior.
package configlimiter // import "go.opentelemetry.io/collector/config/configlimiter"

import (
"context"
"errors"
"fmt"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/extension/extensionlimiter"
)

var (
errLimiterNotFound = errors.New("limiter not found")
errNotLimiter = errors.New("requested extension is not a limiter")
)

// Limiter defines the rate limiting settings for a component.
type Limiter struct {
// LimiterID specifies the name of the extension to use in order to apply rate limiting.
LimiterID component.ID `mapstructure:"limiter,omitempty"`
}

// GetLimiter attempts to select the appropriate extensionlimiter.Limiter from the list of extensions,
// based on the requested extension name. If a limiter is not found, an error is returned.
func (l Limiter) GetRateLimiter(_ context.Context, extensions map[component.ID]component.Component) (extensionlimiter.RateLimiter, error) {
if ext, found := extensions[l.LimiterID]; found {
if limiter, ok := ext.(extensionlimiter.RateLimiter); ok {
return limiter, nil
}
return nil, errNotLimiter
}

return nil, fmt.Errorf("failed to resolve limiter %q: %w", l.LimiterID, errLimiterNotFound)
}

// GetResourceLimiter attempts to select the appropriate extensionlimiter.ResourceLimiter from the list of extensions,
// based on the requested extension name. If a limiter is not found, an error is returned.
func (l Limiter) GetResourceLimiter(_ context.Context, extensions map[component.ID]component.Component) (extensionlimiter.ResourceLimiter, error) {
if ext, found := extensions[l.LimiterID]; found {
if limiter, ok := ext.(extensionlimiter.ResourceLimiter); ok {
return limiter, nil
}
return nil, errNotLimiter
}

return nil, fmt.Errorf("failed to resolve resource limiter %q: %w", l.LimiterID, errLimiterNotFound)
}
29 changes: 29 additions & 0 deletions config/configlimiter/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
module go.opentelemetry.io/collector/config/configlimiterg

go 1.23.0

require (
go.opentelemetry.io/collector/component v1.28.1
go.opentelemetry.io/collector/extension/extensionlimiter v0.0.0-00010101000000-000000000000
)

require (
github.com/gogo/protobuf v1.3.2 // indirect
go.opentelemetry.io/collector/pdata v1.28.1 // indirect
go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/net v0.37.0 // indirect
golang.org/x/sys v0.31.0 // indirect
golang.org/x/text v0.23.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
google.golang.org/grpc v1.71.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
)

replace go.opentelemetry.io/collector/component => ../../component

replace go.opentelemetry.io/collector/extension/extensionlimiter => ../../extension/extensionlimiter
81 changes: 81 additions & 0 deletions config/configlimiter/go.sum

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

1 change: 1 addition & 0 deletions config/configmiddleware/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include ../../Makefile.Common
83 changes: 83 additions & 0 deletions config/configmiddleware/configmiddleware.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

// Package configmiddleware implements the configuration settings to
// apply middleware processing on telemetry data, and allows
// components to configure middleware behavior.
package configmiddleware // import "go.opentelemetry.io/collector/config/configmiddleware"

import (
"context"
"errors"
"fmt"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/extension/extensionmiddleware"
)

var (
errMiddlewareNotFound = errors.New("middleware not found")
errNotMiddleware = errors.New("requested extension is not a middleware")
errNotHTTPServer = errors.New("requested extension is not an HTTP server middleware")
errNotGRPCServer = errors.New("requested extension is not a gRPC server middleware")
errNotHTTPClient = errors.New("requested extension is not an HTTP client middleware")
errNotGRPCClient = errors.New("requested extension is not a gRPC client middleware")
)

// Middleware defines the middleware settings for a component.
type Middleware struct {
// MiddlewareID specifies the name of the extension to use in order to apply middleware processing.
MiddlewareID component.ID `mapstructure:"middleware,omitempty"`
}

// GetHTTPServerMiddleware attempts to select the appropriate extensionmiddleware.HTTPServer from the list of extensions,
// based on the requested extension name. If a middleware is not found, an error is returned.
func (m Middleware) GetHTTPServerMiddleware(_ context.Context, extensions map[component.ID]component.Component) (extensionmiddleware.HTTPServer, error) {
if ext, found := extensions[m.MiddlewareID]; found {
if server, ok := ext.(extensionmiddleware.HTTPServer); ok {
return server, nil
}
return nil, errNotHTTPServer
}

return nil, fmt.Errorf("failed to resolve middleware %q: %w", m.MiddlewareID, errMiddlewareNotFound)
}

// GetGRPCServerMiddleware attempts to select the appropriate extensionmiddleware.GRPCServer from the list of extensions,
// based on the requested extension name. If a middleware is not found, an error is returned.
func (m Middleware) GetGRPCServerMiddleware(_ context.Context, extensions map[component.ID]component.Component) (extensionmiddleware.GRPCServer, error) {
if ext, found := extensions[m.MiddlewareID]; found {
if server, ok := ext.(extensionmiddleware.GRPCServer); ok {
return server, nil
}
return nil, errNotGRPCServer
}

return nil, fmt.Errorf("failed to resolve middleware %q: %w", m.MiddlewareID, errMiddlewareNotFound)
}

// GetHTTPClientMiddleware attempts to select the appropriate extensionmiddleware.HTTPClient from the list of extensions,
// based on the component id of the extension. If a middleware is not found, an error is returned.
// This should be only used by HTTP clients.
func (m Middleware) GetHTTPClientMiddleware(_ context.Context, extensions map[component.ID]component.Component) (extensionmiddleware.HTTPClient, error) {
if ext, found := extensions[m.MiddlewareID]; found {
if client, ok := ext.(extensionmiddleware.HTTPClient); ok {
return client, nil
}
return nil, errNotHTTPClient
}
return nil, fmt.Errorf("failed to resolve middleware %q: %w", m.MiddlewareID, errMiddlewareNotFound)
}

// GetGRPCClientMiddleware attempts to select the appropriate extensionmiddleware.GRPCClient from the list of extensions,
// based on the component id of the extension. If a middleware is not found, an error is returned.
// This should be only used by gRPC clients.
func (m Middleware) GetGRPCClientMiddleware(_ context.Context, extensions map[component.ID]component.Component) (extensionmiddleware.GRPCClient, error) {
if ext, found := extensions[m.MiddlewareID]; found {
if client, ok := ext.(extensionmiddleware.GRPCClient); ok {
return client, nil
}
return nil, errNotGRPCClient
}
return nil, fmt.Errorf("failed to resolve middleware %q: %w", m.MiddlewareID, errMiddlewareNotFound)
}
30 changes: 30 additions & 0 deletions config/configmiddleware/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
module go.opentelemetry.io/collector/config/configlimiter

go 1.23.0

replace go.opentelemetry.io/collector/component => ../../component

replace go.opentelemetry.io/collector/extension/extensionmiddleware => ../../extension/extensionmiddleware

//replace go.opentelemetry.io/collector/extension/extensionmiddleware/extensionmiddlewaretest => ../../extension/extensionmiddleware/extensionmiddlewaretest

require (
go.opentelemetry.io/collector/component v0.0.0-00010101000000-000000000000
go.opentelemetry.io/collector/extension/extensionmiddleware v0.0.0-00010101000000-000000000000
)

require (
github.com/gogo/protobuf v1.3.2 // indirect
go.opentelemetry.io/collector/pdata v1.28.1 // indirect
go.opentelemetry.io/otel v1.35.0 // indirect
go.opentelemetry.io/otel/metric v1.35.0 // indirect
go.opentelemetry.io/otel/trace v1.35.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/net v0.37.0 // indirect
golang.org/x/sys v0.31.0 // indirect
golang.org/x/text v0.23.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
google.golang.org/grpc v1.71.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
)
Loading
Loading