Skip to content

Commit 709f273

Browse files
[GEN-1956]: add Groundcover inCloud destination support and documentation (#2068)
This pull request includes several changes to add support for Groundcover as a new destination and to improve the documentation structure. The most important changes include adding Groundcover configuration, updating documentation to include Groundcover, and refactoring the documentation structure for better readability. ### Groundcover Support: * [`common/config/groundcover.go`](diffhunk://#diff-862004cf677545d5aea954876d73338f4b4e052421d8d37ba79b8b9a0538e0ebR1-R71): Added Groundcover configuration, including endpoint and API key handling, and methods to modify the configuration. * [`common/config/root.go`](diffhunk://#diff-35f076c473aa76e7717e17ac33041f73ec6b16e26fe8a1ab50bf5963cb7fcd8eL18-R23): Included Groundcover in the list of available configurers. * [`common/dests.go`](diffhunk://#diff-e0ef4d5cecfc896240ae7392424f227db50784f83d0ddc0c317db59066f8757bR25): Added Groundcover as a destination type. * [`destinations/data/groundcover.yaml`](diffhunk://#diff-129bbaa520e64dde822316f5a43fbd5552e7161d85a913f3c54f633d951e1544R1-R60): Created a YAML file for Groundcover destination configuration. ### Documentation Updates: * [`docs/backends-overview.mdx`](diffhunk://#diff-26115b197a8b9dd8ee351f05b2cade47da5acd788d74b9f962a325d3e1b919a2R24): Added Groundcover to the list of managed destinations. * [`docs/backends/groundcover.mdx`](diffhunk://#diff-3bb06921493a19e9bc372f59d0b00e6c31558008c48a07831e6006f7ad5b6f98R1-R62): Created a new documentation file for configuring Groundcover inCloud. * [`docs/mint.json`](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debL73-R73): Refactored the documentation structure for better readability and included Groundcover in the list of backends. [[1]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debL73-R73) [[2]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debL102-R114) [[3]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debL153-R134) [[4]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debL192-R170) [[5]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debR198) [[6]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debL251-R223) [[7]](diffhunk://#diff-c91a604899dfef4b2494c317f4fd39a7f22b79986095f580399347293d534debL285-R258) * [`docs/quickstart/next-steps.mdx`](diffhunk://#diff-25ae422c52600166452821f8cc42d670b6b530e5f32a1b3aae657b05adb74ed7R36): Added a card for Groundcover inCloud in the quickstart guide. ### Minor Changes: * [`README.md`](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5L29-R35): Minor formatting adjustments for the key features and managed destinations sections. [[1]](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5L29-R35) [[2]](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5L88-R89) [[3]](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5R103) [[4]](diffhunk://#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5L116-R117) --------- Co-authored-by: Amir Blum <amirgiraffe@gmail.com>
1 parent 51bbb72 commit 709f273

File tree

10 files changed

+173
-1
lines changed

10 files changed

+173
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ For more details, see our [quickstart guide](https://docs.odigos.io/intro).
100100
| Google Cloud Monitoring ||| |
101101
| Google Cloud Storage || ||
102102
| Grafana Cloud ||||
103+
| Groundcover inCloud ||||
103104
| Honeycomb ||||
104105
| Last9 ||| |
105106
| Lightstep || | |

common/config/groundcover.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package config
2+
3+
import (
4+
"errors"
5+
6+
"github.com/odigos-io/odigos/common"
7+
)
8+
9+
const (
10+
GroundcoverEndpoint = "GROUNDCOVER_ENDPOINT"
11+
GroundcoverApiKey = "GROUNDCOVER_API_KEY"
12+
)
13+
14+
var (
15+
ErrorGroundcoverEndpointMissing = errors.New("Groundcover is missing a required field (\"GROUNDCOVER_ENDPOINT\"), Groundcover will not be configured")
16+
ErrorGroundcoverApiKeyMissing = errors.New("Groundcover is missing a required field (\"GROUNDCOVER_API_KEY\"), Groundcover will not be configured")
17+
)
18+
19+
type Groundcover struct{}
20+
21+
func (j *Groundcover) DestType() common.DestinationType {
22+
return common.GroundcoverDestinationType
23+
}
24+
25+
func (j *Groundcover) ModifyConfig(dest ExporterConfigurer, currentConfig *Config) error {
26+
config := dest.GetConfig()
27+
uniqueUri := "groundcover-" + dest.GetID()
28+
29+
url, exists := config[GroundcoverEndpoint]
30+
if !exists {
31+
return ErrorGroundcoverEndpointMissing
32+
}
33+
34+
endpoint, err := parseOtlpGrpcUrl(url, true)
35+
if err != nil {
36+
return err
37+
}
38+
39+
exporterName := "otlp/" + uniqueUri
40+
exporterConfig := GenericMap{
41+
"endpoint": endpoint,
42+
"headers": GenericMap{
43+
"apikey": "${GROUNDCOVER_API_KEY}",
44+
},
45+
}
46+
47+
currentConfig.Exporters[exporterName] = exporterConfig
48+
49+
if isTracingEnabled(dest) {
50+
tracesPipelineName := "traces/" + uniqueUri
51+
currentConfig.Service.Pipelines[tracesPipelineName] = Pipeline{
52+
Exporters: []string{exporterName},
53+
}
54+
}
55+
56+
if isMetricsEnabled(dest) {
57+
tracesPipelineName := "metrics/" + uniqueUri
58+
currentConfig.Service.Pipelines[tracesPipelineName] = Pipeline{
59+
Exporters: []string{exporterName},
60+
}
61+
}
62+
63+
if isLoggingEnabled(dest) {
64+
tracesPipelineName := "logs/" + uniqueUri
65+
currentConfig.Service.Pipelines[tracesPipelineName] = Pipeline{
66+
Exporters: []string{exporterName},
67+
}
68+
}
69+
70+
return nil
71+
}

common/config/root.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const (
1717
var availableConfigers = []Configer{
1818
&AppDynamics{}, &Axiom{}, &AWSS3{}, &AzureBlobStorage{}, &Causely{}, &Chronosphere{}, &Clickhouse{}, &Coralogix{},
1919
&Datadog{}, &Debug{}, &Dynatrace{}, &ElasticAPM{}, &Elasticsearch{}, &GenericOTLP{}, &GoogleCloud{},
20-
&GoogleCloudStorage{}, &GrafanaCloudLoki{}, &GrafanaCloudPrometheus{}, &GrafanaCloudTempo{},
20+
&GoogleCloudStorage{}, &GrafanaCloudLoki{}, &GrafanaCloudPrometheus{}, &GrafanaCloudTempo{}, &Groundcover{},
2121
&Honeycomb{}, &Jaeger{}, &Last9{}, &Lightstep{}, &Logzio{}, &Loki{}, &Lumigo{}, &Middleware{}, &Mock{}, &NewRelic{},
2222
&Nop{}, &OpsVerse{}, &OTLPHttp{}, &Prometheus{}, &Qryn{}, &QrynOSS{}, &Quickwit{}, &Sentry{},
2323
&Signoz{}, &Splunk{}, &SumoLogic{}, &Tempo{}, &Uptrace{},

common/dests.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const (
2222
GrafanaCloudLokiDestinationType DestinationType = "grafanacloudloki"
2323
GrafanaCloudPrometheusDestinationType DestinationType = "grafanacloudprometheus"
2424
GrafanaCloudTempoDestinationType DestinationType = "grafanacloudtempo"
25+
GroundcoverDestinationType DestinationType = "groundcover"
2526
HoneycombDestinationType DestinationType = "honeycomb"
2627
JaegerDestinationType DestinationType = "jaeger"
2728
Last9DestinationType DestinationType = "last9"

destinations/data/groundcover.yaml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
apiVersion: internal.odigos.io/v1beta1
2+
kind: Destination
3+
metadata:
4+
type: groundcover
5+
displayName: Groundcover inCloud
6+
category: managed
7+
spec:
8+
image: groundcover.svg
9+
signals:
10+
traces:
11+
supported: true
12+
metrics:
13+
supported: true
14+
logs:
15+
supported: true
16+
fields:
17+
- name: GROUNDCOVER_ENDPOINT
18+
displayName: Groundcover inCloud Site
19+
componentType: input
20+
componentProps:
21+
type: text
22+
required: true
23+
tooltip: 'Your inCloud Site is part of the configuration provided to you by groundcover when setting up the managed inCloud backend.'
24+
- name: GROUNDCOVER_API_KEY
25+
displayName: Groundcover API Key
26+
componentType: input
27+
secret: true
28+
componentProps:
29+
type: password
30+
required: true

destinations/logos/groundcover.svg

Lines changed: 6 additions & 0 deletions
Loading

docs/backends-overview.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Odigos has destinations for many observability backends.
2121
| Google Cloud Monitoring | Managed ||| |
2222
| Google Cloud Storage | Managed || ||
2323
| Grafana Cloud | Managed ||||
24+
| Groundcover inCloud | Managed ||||
2425
| Honeycomb | Managed ||||
2526
| Jaeger | Self-Hosted || | |
2627
| Last9 | Managed ||| |

docs/backends/groundcover.mdx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
---
2+
title: 'Groundcover inCloud'
3+
---
4+
5+
## Configuring Backend
6+
7+
- **GROUNDCOVER_ENDPOINT** - Endpoint, the format is `host:port`.
8+
- `host` is required, also known as your `inCloud_Site`, it is part of the configuration provided to you by Groundcover when setting up the [inCloud Managed](https://docs.groundcover.com/architecture/incloud-managed) backend.
9+
- `port` is optional, and defaults to the default OpenTelemetry gRPC port `4317`.
10+
- **GROUNDCOVER_API_KEY** - API Key provided by Groundcover, refer to [these docs](https://docs.groundcover.com/architecture/incloud-managed/ingestion-endpoints#fetching-the-api-key) for more info.
11+
12+
## Adding a Destination to Odigos
13+
14+
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:
15+
16+
1. **Using the UI**
17+
18+
Use the [Odigos CLI](https://docs.odigos.io/cli/odigos_ui) to access the UI:
19+
20+
```bash
21+
odigos ui
22+
```
23+
24+
2. **Using kubernetes manifests**
25+
26+
Save the YAML below to a file (e.g., `destination.yaml`) and apply it using `kubectl`:
27+
28+
```bash
29+
kubectl apply -f destination.yaml
30+
```
31+
32+
33+
```yaml
34+
apiVersion: odigos.io/v1alpha1
35+
kind: Destination
36+
metadata:
37+
name: groundcover-example
38+
namespace: odigos-system
39+
spec:
40+
data:
41+
GROUNDCOVER_ENDPOINT: <Groundcover inCloud Site>
42+
destinationName: groundcover
43+
secretRef:
44+
name: groundcover-secret
45+
signals:
46+
- TRACES
47+
- METRICS
48+
- LOGS
49+
type: groundcover
50+
51+
---
52+
apiVersion: v1
53+
data:
54+
GROUNDCOVER_API_KEY: <base64 Groundcover API Key>
55+
kind: Secret
56+
metadata:
57+
name: groundcover-secret
58+
namespace: odigos-system
59+
type: Opaque
60+
```

docs/mint.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@
195195
"backends/grafanacloudloki",
196196
"backends/grafanacloudprometheus",
197197
"backends/grafanacloudtempo",
198+
"backends/groundcover",
198199
"backends/honeycomb",
199200
"backends/jaeger",
200201
"backends/last9",

docs/quickstart/next-steps.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Select the relevant backend for your use case below to connect it to Odigos.
3333
<Card title="Grafana Cloud Loki" href="/backends/grafanacloudloki" />
3434
<Card title="Grafana Cloud Prometheus" href="/backends/grafanacloudprometheus" />
3535
<Card title="Grafana Cloud Tempo" href="/backends/grafanacloudtempo" />
36+
<Card title="Groundcover inCloud" href="/backends/groundcover" />
3637
<Card title="Honeycomb" href="/backends/honeycomb" />
3738
<Card title="Jaeger" href="/backends/jaeger" />
3839
<Card title="Last9" href="/backends/last9" />

0 commit comments

Comments
 (0)