When we set out to trace applications running outside of AWS Lambda, there was little doubt in our minds that building on top OpenTelemetry was by far the best course of action. There are many reasons for this, but chiefly, it is a question of coverage. At its most fundamental level, achieving coverage requires as-wide-as-possible support for technologies, and interoperability among instrumentations. In our industry, there is an incredible amount of diversity in technology that is put in production every day. By its nature, distributed tracing requires non-trivial, bespoke work to support each technology, and that is something that a large community is better suited to do than any single vendor.
As a technical product manager, I was excited by the idea of building out a new tracing product using a combination of an extremely solid open-source technology like OpenTelemetry and effectively greenfield development on Lumigo’s side.
In distributed tracing products, there are two aspects tightly intertwined:
Today, we focus on the tracer side of Lumigo, and specifically the Lumigo OpenTelemetry distributions for Node.js and Python. With each distribution, our goal is to create the easiest, best set up distribution of OpenTelemetry to be used either with Lumigo or other backends out there.
Before we discuss what the Lumigo OpenTelemetry distributions do on top of “vanilla” OpenTelemetry SDKs, let’s clarify what they do not do: lock-in. We take pains to avoid lock-in of our distros in Lumigo:
The result is something we take great pride in:
A trace collected by the Lumigo OpenTelemetry distributions for JS and Python and displayed in Jaeger.
In the image above, you see tracing data collected by two applications, a client and a server talking with one another over HTTP, and instrumented using the Lumigo OpenTelemetry distributions for Node.js and Python, respectively. With respect to a setup that works with Lumigo, all it took was adding and configuring the Jaeger exporter!
const { init } = require(‘@lumigo/opentelemetry’);
const { JaegerExporter } = require(‘@opentelemetry/exporter-jaeger’);
const { BatchSpanProcessor } = require(‘@opentelemetry/sdk-trace-base’);
(async () => {
const { tracerProvider } = await init;
tracerProvider.addSpanProcessor(
new BatchSpanProcessor(
new JaegerExporter({})
)
);
…
);
The full demo is available as an AWS Cloud Development Kit in the Lumigo’s jaeger-demo repository.
But why go to great lengths to keep upstream (and easy to enjoy) compatibility? There’s a few reasons:
Going above and beyond on ease of adoption
Which brings us to the next point: what do Lumigo OpenTelemetry distributions do differently than other distros or the upstream OpenTelemetry SDKs?
I could write more, talking about the redaction of confidential data, or the way we automatically inject the instrumentation, but this blog is way too long as it is. If you want to hear more, you can catch me on the floor of the AWS Community Days Netherlands, on Oct. 3, 2022. If you would like to exchange ideas about OpenTelemetry and distributed tracing in general, you can find me in the Cloud Native Computing Foundation Slack (user id: @mmanciop).
And if you want to see the magic that the backend of Lumigo can do with the wealth of data provided out-of-the-box by the Lumigo OpenTelemetry distributions, sign up for a Lumigo account and get started today.