---
title: "APM Support Matrix"
description: "Supported languages, runtime versions, frameworks, platforms and instrumentation methods for Middleware APM, including zero-code instrumentation options."
section: "APM"
breadcrumb: "APM > Support Matrix"
canonical: "https://docs.middleware.io/apm/support-metrics"
---
# APM Support Matrix

Middleware APM is built on [OpenTelemetry](https://opentelemetry.io/), 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](/get-started/apm) | 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](/get-started/agent/kubernetes/auto-instrumentation) | The OpenTelemetry Operator and Middleware language detector inject language agents into pods | None | Same as language agents |
| [Amazon ECS auto-instrumentation](/get-started/agent/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](/get-started/agent/linux#instrumenting-systemd-services) | The Linux agent injects language agents into systemd services | None (service restart) | Same as language agents |
| [IIS auto-instrumentation](/get-started/apm/dotnet) | Installs OpenTelemetry .NET automatic instrumentation for selected IIS App Pools | None | Same as language agents |
| [OBI (eBPF)](/get-started/agent/linux#zero-code-instrumentation-with-obi) | Captures traces from the Linux kernel using eBPF | None | Protocol-level traces and RED metrics (request rate, errors and duration) |
| [OpenTelemetry native SDKs](/get-started/agent/otel) | 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](/get-started/agent/linux#supported-environments) (including AWS EC2, Azure, GCP and Oracle Cloud Infrastructure) | — | — | ✅ | — | ✅ | ✅ |
| Docker on Linux | — | — | — | — | ✅ | ✅ |
| [Docker Swarm](/get-started/agent/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](/get-started/agent/aws-lambda) and [Google Cloud Run](/get-started/agent/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](/get-started/apm/java) (including Kotlin and [Scala](/get-started/apm/scala)) | ✅ | ✅ | ✅ | ✅ | — | ✅ |
| [Python](/get-started/apm/python) | ✅ | ✅ | ✅ | ✅ | — | ✅ |
| [Node.js](/get-started/apm/nodejs) (including [NestJS](/get-started/apm/nestjs) and [Next.js](/get-started/apm/nextjs)) | ✅ | ✅ | ✅ | ✅ | — | ✅ |
| [.NET](/get-started/apm/dotnet) | ✅ | ✅ | — | — | ✅ | ✅ (.NET on Linux) |
| [Go](/get-started/apm/go) | ✅ | ✅ | — | — | — | ✅ |
| [PHP](/get-started/apm/php) | ✅ | — | — | — | — | ✅ |
| [Ruby](/get-started/apm/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](https://opentelemetry.io/docs/languages/) for your language and export data to Middleware over OTLP. See [Getting Started with OpenTelemetry](/get-started/agent/otel) 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](/get-started/apm/dotnet); .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](https://opentelemetry.io/ecosystem/registry/?component=instrumentation).

## Choosing a Method

- **You can change your application or images:** Use the [language agent](/get-started/apm) 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](/get-started/agent/kubernetes/auto-instrumentation), [ECS auto-instrumentation](/get-started/agent/amazon-ecs#auto-instrumentation), [Linux systemd auto-instrumentation](/get-started/agent/linux#instrumenting-systemd-services) or [IIS auto-instrumentation](/get-started/apm/dotnet).
- **Your runtime version is older than the language agent supports, or your language has no dedicated agent:** Use [OBI](/get-started/agent/linux#zero-code-instrumentation-with-obi) on Linux hosts, including Docker and Docker Swarm.

## OBI Requirements and Coverage

[OpenTelemetry eBPF Instrumentation (OBI)](https://opentelemetry.io/docs/zero-code/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.
