Skip to content

Commit

Permalink
[GEN-2122]: add Lumigo destination support and documentation (#2079)
Browse files Browse the repository at this point in the history
This pull request introduces a new destination, Lumigo, for the Odigos
project. The most important changes include updates to the configuration
files, documentation, and the addition of new files to support Lumigo as
a destination.

### Lumigo Integration:

* Added a new configuration file `common/config/lumigo.go` to handle
Lumigo-specific settings and validations.
* Updated `common/config/root.go` to include Lumigo in the list of
available configurers.
* Updated `common/dests.go` to define `LumigoDestinationType`.
* Added a new destination configuration file
`destinations/data/lumigo.yaml` to define the Lumigo destination
properties.

### Documentation Updates:

* Added a new documentation file `docs/backends/lumigo.mdx` to provide
details on configuring Lumigo as a backend.
* Updated `docs/backends-overview.mdx` to include Lumigo in the list of
supported backends.
* Updated `docs/mint.json` to include Lumigo in various sections for
better navigation and reference.
[[1]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debR204)
[[2]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debL251-R223)

### Minor Fixes:

* Modified
`frontend/webapp/reuseable-components/condition-details/index.tsx` to
provide a default value for the `conditions` prop.

These changes collectively enhance the Odigos project by adding support
for Lumigo as a new destination, updating the necessary configurations,
and providing comprehensive documentation for users.
  • Loading branch information
BenElferink authored Dec 29, 2024
1 parent df7f73a commit a21ffaa
Show file tree
Hide file tree
Showing 11 changed files with 247 additions and 104 deletions.
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

0 comments on commit a21ffaa

Please sign in to comment.