Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[GEN-2122]: add Lumigo destination support and documentation #2079

Merged
merged 9 commits into from
Dec 29, 2024
87 changes: 43 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ Odigos is an open-source distributed tracing solution that simplifyes and improv

## Key Features

* **Code-Free Instrumentation** : Set up distributed tracing in minutes, eliminating manual code modifications.
* **Multi-Language Support** : Works with Java, Python, .NET, Node.js, and Go applications.
* **eBPF-Powered** : Utilizes eBPF technology for high-performance instrumentation of Go applications. eBPF-based instrumentation for Java, Python, and Node.js is available in the enterprise edition.
* **OpenTelemetry Compatible** : Generates traces in OpenTelemetry format for broad tool compatibility.
* **Vendor Agnostic** : Integrates with various monitoring solutions, avoiding vendor lock-in.
* **Automatic Scaling** : Manages and scales OpenTelemetry collectors based on data volume.
* **Opinionated Defaults** : Supplies common defaults and best practices out-of-the-box, requiring no deep knowledge of OpenTelemetry.
- **Code-Free Instrumentation** : Set up distributed tracing in minutes, eliminating manual code modifications.
- **Multi-Language Support** : Works with Java, Python, .NET, Node.js, and Go applications.
- **eBPF-Powered** : Utilizes eBPF technology for high-performance instrumentation of Go applications. eBPF-based instrumentation for Java, Python, and Node.js is available in the enterprise edition.
- **OpenTelemetry Compatible** : Generates traces in OpenTelemetry format for broad tool compatibility.
- **Vendor Agnostic** : Integrates with various monitoring solutions, avoiding vendor lock-in.
- **Automatic Scaling** : Manages and scales OpenTelemetry collectors based on data volume.
- **Opinionated Defaults** : Supplies common defaults and best practices out-of-the-box, requiring no deep knowledge of OpenTelemetry.

## Why Choose Odigos

Expand Down Expand Up @@ -85,48 +85,47 @@ For more details, see our [quickstart guide](https://docs.odigos.io/intro).

### Managed Destinations


| Destination | Traces | Metrics | Logs |
| ------------------------- | :------: | :-------: | :----: |
| AppDynamics | ✅ | ✅ | ✅ |
| Axiom | ✅ | | ✅ |
| AWS S3 | ✅ | | ✅ |
| Azure Blob Storage | ✅ | | ✅ |
| Causely | ✅ | | |
| Chronosphere | ✅ | ✅ | |
| Coralogix | ✅ | ✅ | ✅ |
| Datadog | ✅ | ✅ | ✅ |
| Dynatrace | ✅ | ✅ | ✅ |
| Gigapipe | ✅ | | |
| Google Cloud Monitoring | ✅ | ✅ | |
| Google Cloud Storage | ✅ | | ✅ |
| Grafana Cloud | ✅ | ✅ | ✅ |
| Honeycomb | ✅ | ✅ | ✅ |
| Last9 | ✅ | ✅ | |
| Lightstep | ✅ | | |
| Logz.io | ✅ | ✅ | ✅ |
| New Relic | ✅ | ✅ | ✅ |
| OpsVerse | ✅ | ✅ | ✅ |
| Sentry | ✅ | | |
| Splunk | ✅ | | |
| Sumo Logic | ✅ | ✅ | ✅ |
| ----------------------- | :----: | :-----: | :--: |
| AppDynamics | ✅ | ✅ | ✅ |
| Axiom | ✅ | | ✅ |
| AWS S3 | ✅ | | ✅ |
| Azure Blob Storage | ✅ | | ✅ |
| Causely | ✅ | | |
| Chronosphere | ✅ | ✅ | |
| Coralogix | ✅ | ✅ | ✅ |
| Datadog | ✅ | ✅ | ✅ |
| Dynatrace | ✅ | ✅ | ✅ |
| Gigapipe | ✅ | | |
| Google Cloud Monitoring | ✅ | ✅ | |
| Google Cloud Storage | ✅ | | ✅ |
| Grafana Cloud | ✅ | ✅ | ✅ |
| Honeycomb | ✅ | ✅ | ✅ |
| Last9 | ✅ | ✅ | |
| Lightstep | ✅ | | |
| Logz.io | ✅ | ✅ | ✅ |
| Lumigo | ✅ | ✅ | ✅ |
| New Relic | ✅ | ✅ | ✅ |
| OpsVerse | ✅ | ✅ | ✅ |
| Sentry | ✅ | | |
| Splunk | ✅ | | |
| Sumo Logic | ✅ | ✅ | ✅ |

## Self-Hosted (Open Source) Destinations


| Destination | Traces | Metrics | Logs |
| --------------- | :------: | :-------: | :----: |
| ClickHouse | ✅ | ✅ | ✅ |
| Elasticsearch | ✅ | | ✅ |
| Jaeger | ✅ | | |
| Loki | | | ✅ |
| OTLP | ✅ | ✅ | ✅ |
| OTLP HTTP | ✅ | ✅ | ✅ |
| Prometheus | | ✅ | |
| Quickwit | ✅ | | |
| qryn | ✅ | ✅ | ✅ |
| SigNoz | ✅ | ✅ | ✅ |
| Tempo | ✅ | | |
| ------------- | :----: | :-----: | :--: |
| ClickHouse | ✅ | ✅ | ✅ |
| Elasticsearch | ✅ | | ✅ |
| Jaeger | ✅ | | |
| Loki | | | ✅ |
| OTLP | ✅ | ✅ | ✅ |
| OTLP HTTP | ✅ | ✅ | ✅ |
| Prometheus | | ✅ | |
| Quickwit | ✅ | | |
| qryn | ✅ | ✅ | ✅ |
| SigNoz | ✅ | ✅ | ✅ |
| Tempo | ✅ | | |

Can't find the destination you need? Help us by following our quick [add new destination](https://docs.odigos.io/adding-new-dest) guide and submitting a PR.

Expand Down
69 changes: 69 additions & 0 deletions common/config/lumigo.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package config

import (
"errors"

"github.com/odigos-io/odigos/common"
)

const (
LumigoEndpoint = "LUMIGO_ENDPOINT"
)

var (
ErrorLumigoEndpointMissing = errors.New("Lumigo is missing a required field (\"LUMIGO_ENDPOINT\"), Lumigo will not be configured")
)

type Lumigo struct{}

func (j *Lumigo) DestType() common.DestinationType {
return common.LumigoDestinationType
}

func (j *Lumigo) ModifyConfig(dest ExporterConfigurer, cfg *Config) error {
config := dest.GetConfig()
uniqueUri := "lumigo-" + dest.GetID()

url, exists := config[LumigoEndpoint]
if !exists {
return ErrorLumigoEndpointMissing
}

endpoint, err := parseOtlpHttpEndpoint(url)
if err != nil {
return err
}

exporterName := "otlphttp/" + uniqueUri
exporterConfig := GenericMap{
"endpoint": endpoint,
"headers": GenericMap{
"Authorization": "LumigoToken ${LUMIGO_TOKEN}",
},
}

cfg.Exporters[exporterName] = exporterConfig

if isTracingEnabled(dest) {
pipeName := "traces/" + uniqueUri
cfg.Service.Pipelines[pipeName] = Pipeline{
Exporters: []string{exporterName},
}
}

if isMetricsEnabled(dest) {
pipeName := "metrics/" + uniqueUri
cfg.Service.Pipelines[pipeName] = Pipeline{
Exporters: []string{exporterName},
}
}

if isLoggingEnabled(dest) {
pipeName := "logs/" + uniqueUri
cfg.Service.Pipelines[pipeName] = Pipeline{
Exporters: []string{exporterName},
}
}

return nil
}
12 changes: 6 additions & 6 deletions common/config/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ const (
)

var availableConfigers = []Configer{
&Middleware{}, &AppDynamics{}, &Honeycomb{}, &GrafanaCloudPrometheus{}, &GrafanaCloudTempo{},
&GrafanaCloudLoki{}, &Datadog{}, &NewRelic{}, &Logzio{}, &Last9{}, &Prometheus{},
&Tempo{}, &Loki{}, &Jaeger{}, &GenericOTLP{}, &OTLPHttp{}, &Elasticsearch{}, &Quickwit{}, &Signoz{}, &Qryn{},
&OpsVerse{}, &Splunk{}, &Lightstep{}, &GoogleCloud{}, &GoogleCloudStorage{}, &Sentry{}, &AzureBlobStorage{},
&AWSS3{}, &Dynatrace{}, &Chronosphere{}, &ElasticAPM{}, &Axiom{}, &SumoLogic{}, &Coralogix{}, &Clickhouse{},
&Causely{}, &Uptrace{}, &Debug{}, &QrynOSS{}, &Nop{}, &Mock{},
&AppDynamics{}, &Axiom{}, &AWSS3{}, &AzureBlobStorage{}, &Causely{}, &Chronosphere{}, &Clickhouse{}, &Coralogix{},
&Datadog{}, &Debug{}, &Dynatrace{}, &ElasticAPM{}, &Elasticsearch{}, &GenericOTLP{}, &GoogleCloud{},
&GoogleCloudStorage{}, &GrafanaCloudLoki{}, &GrafanaCloudPrometheus{}, &GrafanaCloudTempo{},
&Honeycomb{}, &Jaeger{}, &Last9{}, &Lightstep{}, &Logzio{}, &Loki{}, &Lumigo{}, &Middleware{}, &Mock{}, &NewRelic{},
&Nop{}, &OpsVerse{}, &OTLPHttp{}, &Prometheus{}, &Qryn{}, &QrynOSS{}, &Quickwit{}, &Sentry{},
&Signoz{}, &Splunk{}, &SumoLogic{}, &Tempo{}, &Uptrace{},
}

type Configer interface {
Expand Down
1 change: 1 addition & 0 deletions common/dests.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ const (
LightstepDestinationType DestinationType = "lightstep"
LogzioDestinationType DestinationType = "logzio"
LokiDestinationType DestinationType = "loki"
LumigoDestinationType DestinationType = "lumigo"
MiddlewareDestinationType DestinationType = "middleware"
MockDestinationType DestinationType = "mock"
NewRelicDestinationType DestinationType = "newrelic"
Expand Down
30 changes: 30 additions & 0 deletions destinations/data/lumigo.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
apiVersion: internal.odigos.io/v1beta1
kind: Destination
metadata:
type: lumigo
displayName: Lumigo
category: managed
spec:
image: lumigo.svg
signals:
traces:
supported: true
metrics:
supported: true
logs:
supported: true
fields:
- name: LUMIGO_ENDPOINT
displayName: Lumigo OTLP HTTP Endpoint
componentType: input
initialValue: 'https://ga-otlp.lumigo-tracer-edge.golumigo.com'
componentProps:
type: text
required: true
- name: LUMIGO_TOKEN
displayName: Lumigo Token
componentType: input
secret: true
componentProps:
type: password
required: true
24 changes: 24 additions & 0 deletions destinations/logos/lumigo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion docs/backends-overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ Odigos has destinations for many observability backends.
| Jaeger | Self-Hosted | ✅ | | |
| Last9 | Managed | ✅ | ✅ | |
| Lightstep | Managed | ✅ | | |
| Loki | Self-Hosted | | | ✅ |
| Logz.io | Managed | ✅ | ✅ | ✅ |
| Loki | Self-Hosted | | | ✅ |
| Lumigo | Managed | ✅ | ✅ | ✅ |
| New Relic | Managed | ✅ | ✅ | ✅ |
| OpsVerse | Managed | ✅ | ✅ | ✅ |
| OTLP | Managed | ✅ | ✅ | ✅ |
Expand Down
58 changes: 58 additions & 0 deletions docs/backends/lumigo.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
title: 'Lumigo'
---

## Configuring Backend

- **LUMIGO_ENDPOINT** - OpenTelemetry HTTP Endpoint, defaults to `https://ga-otlp.lumigo-tracer-edge.golumigo.com`.
- **LUMIGO_TOKEN** - Lumigo Authorization Token.

## Adding a Destination to Odigos

Odigos makes it simple to add and configure destinations, allowing you to select the specific signals [traces/logs/metrics] that you want to send to each destination. There are two primary methods for configuring destinations in Odigos:

1. **Using the UI**

Use the [Odigos CLI](https://docs.odigos.io/cli/odigos_ui) to access the UI:

```bash
odigos ui
```

2. **Using kubernetes manifests**

Save the YAML below to a file (e.g., `destination.yaml`) and apply it using `kubectl`:

```bash
kubectl apply -f destination.yaml
```


```yaml
apiVersion: odigos.io/v1alpha1
kind: Destination
metadata:
name: lumigo-example
namespace: odigos-system
spec:
data:
LUMIGO_ENDPOINT: <Lumigo OTLP HTTP Endpoint>
destinationName: lumigo
secretRef:
name: lumigo-secret
signals:
- TRACES
- METRICS
- LOGS
type: lumigo

---
apiVersion: v1
data:
LUMIGO_TOKEN: <base64 Lumigo Token>
kind: Secret
metadata:
name: lumigo-secret
namespace: odigos-system
type: Opaque
```
Loading
Loading