APM for every language

Traces, slow queries and errors from any OpenTelemetry SDK.

Vigil speaks OTLP/HTTP. Any language with an OpenTelemetry SDK — Ruby, PHP, Go, Java, .NET, Rust, Elixir, and of course Python and Node — sends traces, metrics and logs to Vigil with three environment variables. You get endpoints with p95 and Apdex, slow database queries, slow outgoing calls, N+1 detection, stored traces with a timeline, and logs linked to traces. Errors go through the Sentry-compatible endpoint with the Sentry SDK of your language.

1. Point the SDK at Vigil

Use a server token (Servers → your server → Install; data lands on that server) or a workspace API key (data lands on a virtual server per service). Set these in the app's environment:

OTEL_EXPORTER_OTLP_ENDPOINT=https://puzaricloud.in/otlp
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf        # or http/json
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer vgs_…"
OTEL_SERVICE_NAME=checkout-api
OTEL_RESOURCE_ATTRIBUTES=deployment.environment=production,service.version=1.4.2

Self-hosted: replace the host with yours. Standard OTLP paths (/v1/traces, /v1/metrics, /v1/logs) also work on puzaricloud.in.

2. What Vigil needs on spans

  • Server spans (kind=SERVER) with http.route + http.request.method → endpoints, Apdex, p95.
  • Client spans with db.system + db.statement (or db.query.text) → slow queries, N+1 issues.
  • Client spans with server.address / http.url → slow outgoing requests.
  • Logs with the trace context (every OTel logging bridge does this) → "related logs" on the trace page.

The auto-instrumentation packages below set all of these.

Ruby / Rails
gem "opentelemetry-sdk"; gem "opentelemetry-exporter-otlp"; gem "opentelemetry-instrumentation-all"

# config/initializers/opentelemetry.rb
require "opentelemetry/sdk"
require "opentelemetry/exporter/otlp"
require "opentelemetry/instrumentation/all"
OpenTelemetry::SDK.configure { |c| c.use_all }   # Rails, ActiveRecord, Sidekiq, Net::HTTP, Redis…
PHP / Laravel / Symfony
composer require open-telemetry/sdk open-telemetry/exporter-otlp open-telemetry/opentelemetry-auto-laravel   # or -auto-symfony, -auto-pdo, -auto-guzzle
pecl install opentelemetry && echo "extension=opentelemetry" >> php.ini

# .env
OTEL_PHP_AUTOLOAD_ENABLED=true
OTEL_TRACES_EXPORTER=otlp
Go
go get go.opentelemetry.io/otel go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp

exp, _ := otlptracehttp.New(ctx)                       // reads OTEL_EXPORTER_OTLP_* from the environment
tp := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exp))
otel.SetTracerProvider(tp)
http.ListenAndServe(":8080", otelhttp.NewHandler(mux, "server"))
Java / Spring
java -javaagent:opentelemetry-javaagent.jar -jar app.jar   # zero code: Spring, JDBC, Hibernate, HTTP clients, Kafka…
# same OTEL_* variables; or -Dotel.exporter.otlp.endpoint=https://puzaricloud.in/otlp
.NET
dotnet add package OpenTelemetry.Extensions.Hosting OpenTelemetry.Exporter.OpenTelemetryProtocol OpenTelemetry.Instrumentation.AspNetCore OpenTelemetry.Instrumentation.Http OpenTelemetry.Instrumentation.SqlClient

builder.Services.AddOpenTelemetry().WithTracing(t => t.AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddSqlClientInstrumentation(o => o.SetDbStatementForText = true).AddOtlpExporter());
Node.js (OTel)
npm i @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-http

node --require @opentelemetry/auto-instrumentations-node/register app.js   # Express, pg, mysql, redis, http auto-instrumented
# or use the one-file Vigil SDK: https://puzaricloud.in/vigil-apm.js
Python (OTel)
pip install opentelemetry-distro opentelemetry-exporter-otlp && opentelemetry-bootstrap -a install

opentelemetry-instrument python app.py   # Django, Flask, FastAPI, SQLAlchemy, psycopg, requests…
# or use the one-file Vigil SDK: https://puzaricloud.in/vigil-apm.py
Rust
cargo add opentelemetry opentelemetry-otlp opentelemetry_sdk tracing-opentelemetry

let tracer = opentelemetry_otlp::new_pipeline().tracing().with_exporter(opentelemetry_otlp::new_exporter().http()).install_batch(runtime::Tokio)?;
Elixir / Phoenix
{:opentelemetry, "~> 1.4"}, {:opentelemetry_exporter, "~> 1.7"}, {:opentelemetry_phoenix, "~> 2.0"}, {:opentelemetry_ecto, "~> 1.2"}

# config/runtime.exs
config :opentelemetry, traces_exporter: :otlp   # endpoint/headers from OTEL_EXPORTER_OTLP_* 

Errors

Exceptions with stack traces, grouping, regressions and spikes use the Sentry protocol: create a project under Errors, install the Sentry SDK of your language and paste the DSN. Both can run side by side.