Receives over gRPC and HTTP, exports the same way. OTLP is the format the OpenTelemetry SDKs already speak, so nothing in your code changes to point at it.
All three move through the same process, so there is one thing to run, one config to read and one place to look when telemetry stops arriving.
Spans arrive one at a time and leave in batches. That is the difference between a request per span and a request per few thousand, and your backend feels it.
Tell it how much memory it may use and it refuses work rather than exceeding it. Telemetry is the thing that should degrade during an incident, not the thing that causes one.
This is the collector itself. Build a distribution with the receivers, processors and exporters you actually want, and ship one binary containing those and nothing else.
A binary in your own network. Whatever you decide not to forward, you decide before the data has left — which is the only point where that is still your call.