Recipe - Create OpenTelemetry based Blueprint - Rafay Product Documentation

Configure

In this section, you will create a standardized cluster blueprint with the OpenTelemetry components. You can then reuse this blueprint for all your clusters.

Assumptions

Note

Cert-manager is a requirement for OpenTelemetry. In this example, we will also use cert-manager to issue the certificate for ingress.

Step 1: Create Helm Repository

In this step, you will create Helm repository for Jaeger.

apiVersion: integrations.k8smgmt.io/v3
kind: Repository
metadata:
  name: jaegertracing
  project: defaultproject
spec:
  endpoint: https://jaegertracing.github.io/helm-charts
  type: Helm
rctl apply -f jaeger-repo.yaml

Step 2: Create Namespace

In this step, you will create namespaces for Jaeger and opentelemetry-operator-system.

Jaeger namespace

apiVersion: infra.k8smgmt.io/v3
kind: Namespace
metadata:
  name: jaeger
  project: defaultproject
spec: {}

opentelemetry-operator-system

apiVersion: infra.k8smgmt.io/v3
kind: Namespace
metadata:
  name: opentelemetry-operator-system
  project: defaultproject
spec: {}
rctl apply -f jaeger-ns.yaml
rctl apply -f opentelemetry-ns.yaml

Step 3: Create Add-ons

In this step, you will create a custom add-on for the below components.

Step 3.1: Create Jaeger Addon

apiVersion: infra.k8smgmt.io/v3
kind: Addon
metadata:
  name: jaeger
  project: defaultproject
spec:
  artifact:
    artifact:
      chartName: jaeger
      repository: jaegertracing
      valuesPaths:
      - name: file://artifacts/jaeger/jaeger-custom-values.yaml
    type: Helm
  namespace: jaeger
  version: v1

Jaeger Custom Values

storage:
  type: elasticsearch
  elasticsearch:
    host: <Elasticsearch endpoint>
    port: <Elasticsearch port>
    scheme: https
    anonymous: true
    usePassword: false
provisionDataStore:
  cassandra: false
  elasticsearch: false
collector:
  extraEnv:
    - name: METRICS_STORAGE_TYPE
      value: prometheus
    - name: PROMETHEUS_SERVER_URL
      value: "http://prometheus-server.monitoring.svc.cluster.local:80"
query:
  extraEnv:
    - name: METRICS_STORAGE_TYPE
      value: prometheus
    - name: PROMETHEUS_SERVER_URL
      value: "http://prometheus-server.monitoring.svc.cluster.local:80"
    - name: PROMETHEUS_QUERY_SUPPORT_SPANMETRICS_CONNECTOR
      value: "true"
  ingress:
    enabled: true
    hosts:
    - jaeger-demo.dev.rafay-edge.net
    annotations:
      kubernetes.io/ingress.class: nginx
      kubernetes.io/tls-acme: "true"
      cert-manager.io/cluster-issuer: "letsencrypt-demo"
    pathType: ImplementationSpecific
    tls:
    - secretName: jaeger-tls
      hosts:
      - jaeger-demo.dev.rafay-edge.net
rctl apply -f jaeger-addon.yaml

Step 3.2: Create OpenTelemetry Operator Addon

curl -o opentelemetry-operator.yaml https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
apiVersion: infra.k8smgmt.io/v3
kind: Addon
metadata:
  name: opentelemetry-operator
  project: defaultproject
spec:
  artifact:
    artifact:
      paths:
      - name: file://artifacts/opentelemetry-operator/opentelemetry-operator.yaml
    type: Yaml
  namespace: opentelemetry-operator-system
  version: v1
rctl apply -f opentelemetry-operator-addon.yaml

Step 3.3: Create OpenTelemetry Collector Addon

apiVersion: infra.k8smgmt.io/v3
kind: Addon
metadata:
  name: opentelemetry-collector
  project: defaultproject
spec:
  artifact:
    artifact:
      paths:
      - name: file://artifacts/opentelemetry-collector/opentelemetry-collector.yaml
    type: Yaml
  namespace: opentelemetry-operator-system
  version: v1

OpenTelemetry Collector

apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: simplest
spec:
  image: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.79.0
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: "0.0.0.0:4317"
          http:
            endpoint: "0.0.0.0:4318"
    processors:
      batch:
      spanmetrics:
         metrics_exporter: prometheusremotewrite

connectors:
          spanmetrics:
            namespace: span.metrics
            histogram:
              unit: s
              explicit:
                buckets: [10ms, 100ms, 200ms, 400ms, 800ms, 1s, 1200ms, 1400ms, 1600ms, 1800ms, 2s, 5s, 7s]
            dimensions:
              - name: http.method
              - name: http.status_code
              - name: http.target
              - name: http.url
              - name: http.route
    exporters:
      jaeger:
        endpoint: jaeger-collector.jaeger.svc.cluster.local:14250
        tls:
          insecure: true
      prometheusremotewrite:
         endpoint: "http://prometheus-server.monitoring.svc.cluster.local:80/api/v1/write"
    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch,spanmetrics]
          exporters: [jaeger,spanmetrics]
        metrics:
          receivers: [otlp,spanmetrics]
          processors: [batch]
          exporters: [prometheusremotewrite]
rctl apply -f opentelemetry-collector-addon.yaml

Step 4: Create OpenTelemetry Blueprint

In this step, you will create a custom blueprint for OpenTelemetry

apiVersion: infra.k8smgmt.io/v3
kind: Blueprint
metadata:
  name: opentelemetry
  project: defaultproject
spec:
  base:
    name: default
    version: 1.25.0
  customAddons:
  - name: jaeger
    version: v1
  - name: opentelemetry-operator
    version: v1
  - name: opentelemetry-collector
    version: v1
  defaultAddons:
    enableMonitoring: true
  type: custom
  version: v1
rctl apply -f opentelemetry-blueprint.yaml

Step 5: Apply Blueprint

In this step, you will apply the previously created cluster blueprint to an existing cluster. The blueprint will deploy the OpenTelemetry add-ons to the cluster.

Next Step

At this point, you have done everything required to get OpenTelemetry configured and operational on your cluster. In the next step, we will see the traces and metrics in Jaeger UI.