Skip to content

Commit

Permalink
Initial support for auto-instrumentation
Browse files Browse the repository at this point in the history
Signed-off-by: Pavol Loffay <[email protected]>
  • Loading branch information
pavolloffay committed Oct 26, 2021
1 parent ca4c187 commit 7cc730e
Show file tree
Hide file tree
Showing 27 changed files with 1,789 additions and 118 deletions.
44 changes: 43 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@

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

Expand Down Expand Up @@ -146,6 +148,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
)
74 changes: 74 additions & 0 deletions api/instrumentation/v1alpha1/opentelemetryinst_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// 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 {
// +optional
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
Java JavaSpec `json:"java,omitempty"`
// +optional
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
Exporter `json:"exporter,omitempty"`
}

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

// Exporter defines OTLP exporter configuration.
type Exporter struct {
// +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 7cc730e

Please sign in to comment.