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

contrib/envoyproxy: envoy external processing support #2895

Merged
merged 16 commits into from
Dec 16, 2024

Conversation

e-n-0
Copy link
Member

@e-n-0 e-n-0 commented Sep 27, 2024

Motivation

This is the part 1 PR to support Envoy's External Processing.
You can find all related document for this implementation in Confluence ASM - GCP Services Extensions.
You can find the part 2 of this PR here.

What does this PR do?

This PR adds a new gRPC Interceptor (StreamServerInterceptor) to support the interception of ext_proc v3 calls to gRPC server. When the interceptor is applied, all messages of the external processing protocol are instrumented without returning an handle to the original server code. The implementation of a server using this instrumentation can be found in the part 2.

The implementation includes:

  • Analysing synchronously HTTP Requests and Responses data (headers, ip, path, host, status code)
  • Blocking requests (supporting blocking with content-type and redirect)
  • Some refacto of existing code to handle more easily crafted requests without an actual valid http.Request object.

Tests

This PR includes unit testing in the envoy_tests.go, simulating scenarios of malicious or benign requests, validating span tags, security events and blocking results.

System-tests have been implemented on this PR. A new external-processing scenario has been added in the golang stage.

Reviewer's Checklist

  • Changed code has unit tests for its functionality at or near 100% coverage.
  • System-Tests covering this feature have been added and enabled with the va.b.c-dev version tag.
  • There is a benchmark for any new code, or changes to existing code.
  • If this interacts with the agent in a new way, a system test has been added.
  • Add an appropriate team label so this PR gets put in the right place for the release notes.
  • Non-trivial go.mod changes, e.g. adding new modules, are reviewed by @DataDog/dd-trace-go-guild.

Unsure? Have a question? Request a review!

@DataDog DataDog deleted a comment from datadog-datadog-prod-us1 bot Sep 27, 2024
@DataDog DataDog deleted a comment from datadog-datadog-prod-us1 bot Sep 27, 2024
@DataDog DataDog deleted a comment from datadog-datadog-prod-us1 bot Sep 27, 2024
@DataDog DataDog deleted a comment from datadog-datadog-prod-us1 bot Sep 27, 2024
@DataDog DataDog deleted a comment from datadog-datadog-prod-us1 bot Sep 27, 2024
@DataDog DataDog deleted a comment from datadog-datadog-prod-us1 bot Sep 27, 2024
@e-n-0 e-n-0 force-pushed the flavien/service-extensions branch 7 times, most recently from fcbd354 to a587a09 Compare September 27, 2024 13:33
@pr-commenter
Copy link

pr-commenter bot commented Sep 27, 2024

Benchmarks

Benchmark execution time: 2024-12-16 13:53:07

Comparing candidate commit bece5b0 in PR branch flavien/service-extensions with baseline commit a8665eb in branch main.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 58 metrics, 1 unstable metrics.

@e-n-0 e-n-0 force-pushed the flavien/service-extensions branch 16 times, most recently from 4134743 to a96cc2a Compare September 30, 2024 15:26
@e-n-0 e-n-0 force-pushed the flavien/service-extensions branch from c7063d8 to b0844b8 Compare November 28, 2024 14:59
@e-n-0 e-n-0 requested a review from rarguelloF December 11, 2024 10:09
@e-n-0 e-n-0 force-pushed the flavien/service-extensions branch from b0844b8 to 961d73d Compare December 11, 2024 10:14
@datadog-datadog-prod-us1
Copy link

datadog-datadog-prod-us1 bot commented Dec 11, 2024

Datadog Report

Branch report: flavien/service-extensions
Commit report: 2cbd26c
Test service: dd-trace-go

✅ 0 Failed, 5112 Passed, 70 Skipped, 2m 53.79s Total Time

contrib/envoyproxy/go-control-plane/envoy.go Outdated Show resolved Hide resolved
Comment on lines 16 to 29
// Create a listener for the server.
ln, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatal(err)
}

// Create the server interceptor using the envoy go control plane package.
si := go_control_plane.StreamServerInterceptor()

// Initialize the grpc server as normal, using the envoy server interceptor.
s := grpc.NewServer(grpc.StreamInterceptor(si))

// ... register your services

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add a more "real-world" like example? similar to https://github.com/envoyproxy/go-control-plane/blob/main/examples/dyplomat/main.go#L43-L53

(currently this example is just a generic grpc server without any envoyproxy stuff)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I applied change in 22d7095
Tell me if that is looking good for you 😄

contrib/envoyproxy/go-control-plane/envoy.go Outdated Show resolved Hide resolved
}
}()

for {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I find this pattern a little bit odd for an interceptor / middleware.

Since it seems this is pretty much specifically intended to override the behaviour of ext_procv3.ExternalProcessorServer.Process, have you considered exporting this functionality as an implementation of this interface instead of a middleware? This way, users could just do:

import envoytrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/envoyproxy/go-control-plane"

// srv would be the user provided implementation of `ext_procv3.ExternalProcessorServer`
appsecBlockSrv := envoytrace.AppsecBlockingProcessorServer(srv) // internally you would call srv.Process() when the request is not blocked
ext_procv3.RegisterExternalProcessorServer(grpcServer, appsecBlockSrv)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed it in 22d7095
Is that what you were thinking of?

contrib/envoyproxy/go-control-plane/envoy.go Outdated Show resolved Hide resolved
contrib/envoyproxy/go-control-plane/envoy.go Outdated Show resolved Hide resolved
@e-n-0 e-n-0 requested a review from rarguelloF December 11, 2024 16:28
Copy link
Contributor

@rarguelloF rarguelloF left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! thanks for your patience! 😄 @e-n-0

Copy link
Member

@darccio darccio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving this PR with some nits (only apply if you want).

contrib/envoyproxy/go-control-plane/envoy.go Outdated Show resolved Hide resolved
contrib/envoyproxy/go-control-plane/envoy.go Outdated Show resolved Hide resolved
contrib/envoyproxy/go-control-plane/envoy.go Outdated Show resolved Hide resolved
contrib/envoyproxy/go-control-plane/envoy.go Outdated Show resolved Hide resolved
@eliottness eliottness merged commit c0d5d5a into main Dec 16, 2024
182 checks passed
@eliottness eliottness deleted the flavien/service-extensions branch December 16, 2024 13:57
eliottness added a commit that referenced this pull request Dec 16, 2024
This PR adds a new gRPC Interceptor (StreamServerInterceptor) to support the interception of ext_proc v3 calls to gRPC server. When the interceptor is applied, all messages of the external processing protocol are instrumented without returning an handle to the original server code

Co-authored-by: Eliott Bouhana <[email protected]>
Co-authored-by: Flavien Darche <[email protected]>
e-n-0 added a commit that referenced this pull request Dec 23, 2024
ddtrace/tracer: initialize runtimeMetricsV2 with statsd "direct" client (#3006)

Co-authored-by: Felix Geisendörfer <[email protected]>
Co-authored-by: Nayef Ghattas <[email protected]>

fix(.github/workflows): add tags-ignore to avoid running CI on pushing tags for contribs and other nested modules (#3005)

Co-authored-by: Hannah Kim <[email protected]>

contrib/envoyproxy: envoy external processing support (#2895)

This PR adds a new gRPC Interceptor (StreamServerInterceptor) to support the interception of ext_proc v3 calls to gRPC server. When the interceptor is applied, all messages of the external processing protocol are instrumented without returning an handle to the original server code

Co-authored-by: Eliott Bouhana <[email protected]>
Co-authored-by: Flavien Darche <[email protected]>

add go mod to workflows/apps (#3036)

go.mod: module go.opentelemetry.io/collector/pdata@latest found (v1.21.0), but does not contain package go.opentelemetry.io/collector/pdata/internal/data/protogen/profiles/v1experimental (#3042)

Signed-off-by: Eliott Bouhana <[email protected]>

chore: update latest majors (#2993)
e-n-0 added a commit that referenced this pull request Dec 23, 2024
ddtrace/tracer: initialize runtimeMetricsV2 with statsd "direct" client (#3006)

Co-authored-by: Felix Geisendörfer <[email protected]>
Co-authored-by: Nayef Ghattas <[email protected]>

fix(.github/workflows): add tags-ignore to avoid running CI on pushing tags for contribs and other nested modules (#3005)

Co-authored-by: Hannah Kim <[email protected]>

contrib/envoyproxy: envoy external processing support (#2895)

This PR adds a new gRPC Interceptor (StreamServerInterceptor) to support the interception of ext_proc v3 calls to gRPC server. When the interceptor is applied, all messages of the external processing protocol are instrumented without returning an handle to the original server code

Co-authored-by: Eliott Bouhana <[email protected]>
Co-authored-by: Flavien Darche <[email protected]>

add go mod to workflows/apps (#3036)

go.mod: module go.opentelemetry.io/collector/pdata@latest found (v1.21.0), but does not contain package go.opentelemetry.io/collector/pdata/internal/data/protogen/profiles/v1experimental (#3042)

Signed-off-by: Eliott Bouhana <[email protected]>

chore: update latest majors (#2993)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
apm:ecosystem contrib/* related feature requests or bugs appsec
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants