Skip to content

Commit

Permalink
Add initial support for auto-instrumentation (#464)
Browse files Browse the repository at this point in the history
* Initial support for auto-instrumentation

Signed-off-by: Pavol Loffay <p.loffay@gmail.com>

* fix

Signed-off-by: Pavol Loffay <p.loffay@gmail.com>

* Fix bundle

Signed-off-by: Pavol Loffay <p.loffay@gmail.com>

* Add docs

Signed-off-by: Pavol Loffay <p.loffay@gmail.com>

* make a nonsense change

Signed-off-by: Pavol Loffay <p.loffay@gmail.com>

* Add link

Signed-off-by: Pavol Loffay <p.loffay@gmail.com>
  • Loading branch information
pavolloffay authored Nov 2, 2021
1 parent c3f411c commit dd248a3
Show file tree
Hide file tree
Showing 27 changed files with 1,812 additions and 111 deletions.
45 changes: 44 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@

The OpenTelemetry Operator is an implementation of a [Kubernetes Operator](https://coreos.com/operators/).

At this point, it has [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector) as the only managed component.
The operator manages:
* [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector)
* auto-instrumentation of the workloads using OpenTelemetry instrumentation libraries

## Documentation

* [OpenTelemetryCollector Custom Resource Specification](./docs/otelcol_cr_spec.md)
* [Instrumentation Custom Resource Specification](./docs/otelinst_cr_spec.md)

## Getting started

Expand Down Expand Up @@ -151,6 +154,46 @@ spec:
EOF
```

### OpenTelemetry auto-instrumentation injection

The operator can inject and configure OpenTelemetry auto-instrumentation libraries. At this moment, the operator can inject only
OpenTelemetry [Java auto-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation).

The injection of the Java agent can be enabled by adding an annotation to the namespace, so that all pods within that
namespace will get the instrumentation, or by adding the annotation to individual PodSpec objects, available as part
of Deployment, Statefulset, and other resources.

```console
instrumentation.opentelemetry.io/inject-java: "true"
```

The value can be
* `false` - do not inject
* `true` - inject
* `java-instrumentation` - name of `Instrumentation` CR instance.

In the addition to the annotation the following `CR` has to be created. The `Instrumentation`
provides configuration for OpenTelemetry SDK and auto-instrumentation.

```yaml
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: java-instrumentation
spec:
exporter:
endpoint: http://otel-collector:4318
java:
image: ghcr.io/pavolloffay/otel-javaagent:1.5.3 # <1>
EOF
```

1. Container image with [OpenTelemetry Java auto-instrumentation](https://github.com/open-telemetry/opentelemetry-java-instrumentation).
The image has to contain Java agent JAR `/javaagent.jar` and the JAR is copied to a shared volume mounted to the application container.

The above CR can be queried by `kubectl get otelinst`.

## Compatibility matrix

### OpenTelemetry Operator vs. OpenTelemetry Collector
Expand Down
34 changes: 34 additions & 0 deletions api/instrumentation/v1alpha1/groupversion_info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Package v1alpha1 contains API Schema definitions for the core v1alpha1 API group.
// +kubebuilder:object:generate=true
// +groupName=opentelemetry.io
package v1alpha1

import (
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/scheme"
)

var (
// GroupVersion is group version used to register these objects.
GroupVersion = schema.GroupVersion{Group: "opentelemetry.io", Version: "v1alpha1"}

// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}

// AddToScheme adds the types in this group-version to the given scheme.
AddToScheme = SchemeBuilder.AddToScheme
)
79 changes: 79 additions & 0 deletions api/instrumentation/v1alpha1/instrumentation_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package v1alpha1

import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

// InstrumentationSpec defines the desired state of OpenTelemetry SDK and instrumentation.
type InstrumentationSpec struct {
// Exporter defines exporter configuration.
// +optional
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
Exporter `json:"exporter,omitempty"`

// Java defines configuration for java auto-instrumentation.
// +optional
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
Java JavaSpec `json:"java,omitempty"`
}

// JavaSpec defines Java SDK and instrumentation configuration.
type JavaSpec struct {
// Image is a container image with javaagent JAR.
// +optional
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
Image string `json:"image,omitempty"`
}

// Exporter defines OTLP exporter configuration.
type Exporter struct {
// Endpoint is address of the collector with OTLP endpoint.
// +optional
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
Endpoint string `json:"endpoint,omitempty"`
}

// InstrumentationStatus defines status of the instrumentation.
type InstrumentationStatus struct {
}

// +kubebuilder:object:root=true
// +kubebuilder:resource:shortName=otelinst;otelinsts
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp"
// +operator-sdk:csv:customresourcedefinitions:displayName="OpenTelemetry Instrumentation"

// Instrumentation is the spec for OpenTelemetry instrumentation.
// nolint: maligned
type Instrumentation struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

Spec InstrumentationSpec `json:"spec,omitempty"`
Status InstrumentationStatus `json:"status,omitempty"`
}

// +kubebuilder:object:root=true

// InstrumentationList contains a list of Instrumentation.
type InstrumentationList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Instrumentation `json:"items"`
}

func init() {
SchemeBuilder.Register(&Instrumentation{}, &InstrumentationList{})
}
145 changes: 145 additions & 0 deletions api/instrumentation/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions bundle/manifests/opentelemetry-operator.clusterserviceversion.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ spec:
apiservicedefinitions: {}
customresourcedefinitions:
owned:
- kind: Instrumentation
name: instrumentations.opentelemetry.io
version: v1alpha1
- kind: OpenTelemetryCollector
name: opentelemetrycollectors.opentelemetry.io
version: v1alpha1
Expand Down Expand Up @@ -146,6 +149,14 @@ spec:
- get
- list
- update
- apiGroups:
- opentelemetry.io
resources:
- instrumentations
verbs:
- get
- list
- watch
- apiGroups:
- opentelemetry.io
resources:
Expand Down
Loading

0 comments on commit dd248a3

Please sign in to comment.