APM Support Matrix
Middleware APM is built on OpenTelemetry, and offers several ways to instrument your applications, from deep, code-level language agents to kernel-level eBPF instrumentation that needs no changes to your application at all.
Because of this layered approach, if your application runs on Linux and communicates over HTTP, gRPC or common database protocols, Middleware can trace it, regardless of its programming language or runtime version, and without code changes.
This page summarizes which languages, runtime versions, frameworks and platforms are supported by each instrumentation method.
Instrumentation Methods#
Middleware APM supports the following instrumentation methods. Choose the method that best fits your platform and how much control you have over your application code and images.
| Method | How it works | Code or image changes | Depth of visibility |
|---|---|---|---|
| Language agents and SDKs | Add the Middleware or OpenTelemetry agent to your application | Agent or package added to the application | Code-level spans, custom instrumentation, continuous profiling (where available) |
| Kubernetes auto-instrumentation | The OpenTelemetry Operator and Middleware language detector inject language agents into pods | None | Same as language agents |
| Amazon ECS auto-instrumentation | The mw-ecs CLI adds an init container and environment variables to your task definitions | None (new task definition revision) | Same as language agents |
| Linux systemd auto-instrumentation | The Linux agent injects language agents into systemd services | None (service restart) | Same as language agents |
| IIS auto-instrumentation | Installs OpenTelemetry .NET automatic instrumentation for selected IIS App Pools | None | Same as language agents |
| OBI (eBPF) | Captures traces from the Linux kernel using eBPF | None | Protocol-level traces and RED metrics (request rate, errors and duration) |
| OpenTelemetry native SDKs | Use any OpenTelemetry SDK and export over OTLP to Middleware | SDK added to the application | Code-level spans and custom instrumentation |
Platform Support#
The table below shows which instrumentation methods are available on each platform. Language agents, SDKs and OpenTelemetry native SDKs are supported on every platform.
| Platform | Kubernetes auto-instrumentation | ECS auto-instrumentation | Linux systemd auto-instrumentation | IIS auto-instrumentation | OBI (eBPF) | Language agents and SDKs |
|---|---|---|---|---|---|---|
| Linux VMs and bare metal (including AWS EC2, Azure, GCP and Oracle Cloud Infrastructure) | — | — | ✅ | — | ✅ | ✅ |
| Docker on Linux | — | — | — | — | ✅ | ✅ |
| Docker Swarm | — | — | — | — | ✅ | ✅ |
| Kubernetes (including EKS, AKS, GKE and OKE) | ✅ | — | — | — | — | ✅ |
| Amazon ECS on EC2 | — | ✅ | — | — | — | ✅ |
| Amazon ECS on Fargate | — | ✅ | — | — | — | ✅ |
| Windows Server with IIS | — | — | — | ✅ | — | ✅ |
| Serverless (for example, AWS Lambda and Google Cloud Run) | — | — | — | — | — | ✅ |
Language Support#
Instrumentation methods by language#
| Language | Language agent / SDK | Kubernetes auto-instrumentation | ECS auto-instrumentation | Linux systemd auto-instrumentation | IIS auto-instrumentation | OBI (eBPF) |
|---|---|---|---|---|---|---|
| Java (including Kotlin and Scala) | ✅ | ✅ | ✅ | ✅ | — | ✅ |
| Python | ✅ | ✅ | ✅ | ✅ | — | ✅ |
| Node.js (including NestJS and Next.js) | ✅ | ✅ | ✅ | ✅ | — | ✅ |
| .NET | ✅ | ✅ | — | — | ✅ | ✅ (.NET on Linux) |
| Go | ✅ | ✅ | — | — | — | ✅ |
| PHP | ✅ | — | — | — | — | ✅ |
| Ruby | ✅ | ✅ | — | — | — | ✅ |
| Rust | ✅ (OpenTelemetry SDK) | — | — | — | — | ✅ |
| C++ | ✅ (OpenTelemetry SDK) | — | — | — | — | ✅ |
| Elixir and Erlang | ✅ (OpenTelemetry SDK) | — | — | — | — | ✅ |
| Swift | ✅ (OpenTelemetry SDK) | — | — | — | — | ✅ |
| Any other language on Linux | — | — | — | — | — | ✅ |
For languages without a dedicated Middleware agent, use the official OpenTelemetry SDK for your language and export data to Middleware over OTLP. See Getting Started with OpenTelemetry for endpoint and authentication details.
Runtime versions and popular frameworks#
| Language | Language agent / SDK supports | Older runtime versions | Popular frameworks and libraries |
|---|---|---|---|
| Java | Java 8+ | Supported with OBI | Spring Boot, Spring MVC, Spring WebFlux, Jakarta EE / Servlet, Tomcat, Jetty, JBoss / WildFly, Quarkus, Micronaut, Vert.x, JDBC, Hibernate, Kafka, RabbitMQ, gRPC |
| Python | Python 3.9+ | Supported with OBI | Django, Flask, FastAPI, Starlette, Tornado, Pyramid, Falcon, Celery, SQLAlchemy, psycopg / psycopg2, PyMySQL, PyMongo, Redis, Requests, httpx, aiohttp, gRPC, Kafka |
| Node.js | Node.js 18.17.1+ | Supported with OBI | Express, Fastify, Koa, Hapi, NestJS, Next.js 13.4+, pg, MySQL, MongoDB, Redis / ioredis, KafkaJS, gRPC |
| .NET | .NET 6.0+; .NET Framework 4.6.2+ on IIS | .NET Framework applications with older dependency versions are handled automatically by IIS auto-instrumentation; .NET on Linux with OBI | ASP.NET Core, ASP.NET MVC / Web API (.NET Framework), WCF, HttpClient, SqlClient, Entity Framework Core, gRPC |
| Go | Go 1.17+ | Supported with OBI | Gin, Chi, net/http, gRPC, database/sql, GORM, go-pg, MongoDB driver |
| PHP | PHP 8.0+ | Supported with OBI | Laravel, Symfony, Slim, PDO, cURL |
| Ruby | Ruby 3.0+ | Supported with OBI | Rails, Sinatra, Rack |
| Rust, C++, Elixir / Erlang, Swift | As supported by the OpenTelemetry SDK for the language | Supported with OBI | As supported by the OpenTelemetry instrumentation libraries for the language |
Framework support for language agents comes from the OpenTelemetry instrumentation libraries. For the complete list for each language, see the OpenTelemetry registry of supported libraries and frameworks.
Choosing a Method#
- You can change your application or images: Use the language agent for your language for the deepest visibility, including custom spans and continuous profiling.
- You cannot change your application or images: Use the zero-code method for your platform: Kubernetes auto-instrumentation, ECS auto-instrumentation, Linux systemd auto-instrumentation or IIS auto-instrumentation.
- Your runtime version is older than the language agent supports, or your language has no dedicated agent: Use OBI on Linux hosts, including Docker and Docker Swarm.
OBI Requirements and Coverage#
OpenTelemetry eBPF Instrumentation (OBI) works independently of your application's language and runtime version, because it observes network and protocol activity from the Linux kernel.
- Operating system: Linux with kernel 5.8 or later and BTF enabled, or kernel 4.18 or later on RHEL-family distributions (Red Hat, CentOS, Rocky Linux, Oracle Linux).
- What it captures: Traces and RED metrics (request rate, errors and duration) for HTTP/HTTPS, HTTP/2, gRPC and common database and messaging protocols, such as SQL, Redis and Kafka.
- What it does not capture: Code-level spans inside your application, custom instrumentation and continuous profiling. Use a language agent or SDK when you need this level of detail.