Skip to content

Commit

Permalink
Add Last9 as destination (#1828)
Browse files Browse the repository at this point in the history
Add [Last9](https://last9.io) as a destination.

Last9 supports all telemetry signals [Logs](https://last9.io/logs),
[Metrics](https://last9.io/metrics/) and
[Traces](https://last9.io/traces/)

---------

Co-authored-by: Amir Blum <amirgiraffe@gmail.com>
Co-authored-by: Ben Elferink <ben.elferink@icloud.com>
  • Loading branch information
3 people authored Dec 2, 2024
1 parent c3b9422 commit 36f258c
Show file tree
Hide file tree
Showing 8 changed files with 168 additions and 2 deletions.
60 changes: 60 additions & 0 deletions common/config/last9.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package config

import (
"errors"

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

const (
l9OtlpEndpointKey = "LAST9_OTLP_ENDPOINT"
l9OtlpAuthHeaderKey = "LAST9_OTLP_BASIC_AUTH_HEADER"
)

type Last9 struct{}

func (m *Last9) DestType() common.DestinationType {
// DestinationType defined in common/dests.go
return common.Last9DestinationType
}

func (m *Last9) ModifyConfig(dest ExporterConfigurer, currentConfig *Config) error {
config := dest.GetConfig()
l9OtlpEndpoint, exists := config[l9OtlpEndpointKey]
if !exists {
return errors.New("Last9 OpenTelemetry Endpoint key(\"LAST9_OTLP_ENDPOINT\") not specified, Last9 will not be configured")
}

// to make sure that the exporter name is unique, we'll ask a ID from destination
exporterName := "otlp/last9-" + dest.GetID()
currentConfig.Exporters[exporterName] = GenericMap{
"endpoint": l9OtlpEndpoint,
"headers": GenericMap{
"Authorization": "${LAST9_OTLP_BASIC_AUTH_HEADER}",
},
}

// Modify the config here
if isTracingEnabled(dest) {
tracesPipelineName := "traces/last9-" + dest.GetID()
currentConfig.Service.Pipelines[tracesPipelineName] = Pipeline{
Exporters: []string{exporterName},
}
}

if isMetricsEnabled(dest) {
metricsPipelineName := "metrics/last9-" + dest.GetID()
currentConfig.Service.Pipelines[metricsPipelineName] = Pipeline{
Exporters: []string{exporterName},
}
}

if isLoggingEnabled(dest) {
logsPipelineName := "logs/last9-" + dest.GetID()
currentConfig.Service.Pipelines[logsPipelineName] = Pipeline{
Exporters: []string{exporterName},
}
}

return nil
}
2 changes: 1 addition & 1 deletion common/config/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const (

var availableConfigers = []Configer{
&Middleware{}, &Honeycomb{}, &GrafanaCloudPrometheus{}, &GrafanaCloudTempo{},
&GrafanaCloudLoki{}, &Datadog{}, &NewRelic{}, &Logzio{}, &Prometheus{},
&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{},
Expand Down
1 change: 1 addition & 0 deletions common/dests.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const (
GrafanaCloudTempoDestinationType DestinationType = "grafanacloudtempo"
HoneycombDestinationType DestinationType = "honeycomb"
JaegerDestinationType DestinationType = "jaeger"
Last9DestinationType DestinationType = "last9"
LightstepDestinationType DestinationType = "lightstep"
LogzioDestinationType DestinationType = "logzio"
LokiDestinationType DestinationType = "loki"
Expand Down
31 changes: 31 additions & 0 deletions destinations/data/last9.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
apiVersion: internal.odigos.io/v1beta1
kind: Destination
metadata:
type: last9
displayName: Last9
category: managed
spec:
image: last9.svg
signals:
traces:
supported: true
metrics:
supported: true
logs:
supported: true
fields:
- name: LAST9_OTLP_ENDPOINT
displayName: Last9 OpenTelemetry Endpoint
componentType: input
componentProps:
type: text
required: true
tooltip: 'Last9 OpenTelemetry Endpoint. Can be found at https://app.last9.io/integrations?category=all&integration=OpenTelemetry'
- name: LAST9_OTLP_BASIC_AUTH_HEADER
displayName: Basic Auth Header
componentType: input
secret: true
componentProps:
type: password
required: true
placeholder: "Basic ..."
1 change: 1 addition & 0 deletions destinations/logos/last9.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
72 changes: 72 additions & 0 deletions docs/backends/last9.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
title: "Last9"
---

## Obtaining Last9 OpenTelemetry Endpoint and Basic Auth Header

[Click here](https://app.last9.io/integrations?category=all&integration=OpenTelemetry) to visit the Last9 OpenTelemetry integration page.

<Frame>
<img src="/backends/images/last9.png" alt="OpenTelemetry integration in Last9" />
</Frame>

## Configuring Last9 Backend

- **Endpoint** - Last9 OpenTelemetry Endpoint obtained in above step.
- **Authorization Header**: Last9 OpenTelemetry Basic Auth Header obtained in above step.

## 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**
To add a destination via the UI, follow these steps:
- Use the Odigos CLI to access the UI: [Odigos UI](https://docs.odigos.io/cli/odigos_ui)
```bash
odigos ui
```
- In the left sidebar, navigate to the `Destination` page.

- Click `Add New Destination`

- Select `Last9` and follow the on-screen instructions.



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: last9-example
namespace: odigos-system
spec:
data:
LAST9_OTLP_ENDPOINT: <Last9 OpenTelemetry Endpoint>
destinationName: last9
secretRef:
name: last9-secret
signals:
- TRACES
- METRICS
- LOGS
type: last9

---
apiVersion: v1
data:
LAST9_OTLP_BASIC_AUTH_HEADER: <base64 Basic Auth Header>
kind: Secret
metadata:
name: last9-secret
namespace: odigos-system
type: Opaque
```
Binary file added docs/images/last9.png
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/mint.json
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
"instrumentations/java/java",
"instrumentations/java/ebpf"
]
}
}
]
},
{
Expand Down Expand Up @@ -218,6 +218,7 @@
"backends/honeycomb",
"backends/jaeger",
"backends/lightstep",
"backends/last9",
"backends/logzio",
"backends/loki",
"backends/newrelic",
Expand Down

0 comments on commit 36f258c

Please sign in to comment.