Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add initial support for auto-instrumentation #464

Merged
merged 6 commits into from
Nov 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -146,6 +149,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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not have forced line wraps in this file, as editors can do it as well. While I don't have a particular preference, I do prefer the same style to be used consistently.

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
pavolloffay marked this conversation as resolved.
Show resolved Hide resolved
* `java-instrumentation` - name of `Instrumentation` CR instance.

In the addition to the annotation the following `CR` has to be created. The `Instrumentation`
pavolloffay marked this conversation as resolved.
Show resolved Hide resolved
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.
pavolloffay marked this conversation as resolved.
Show resolved Hide resolved

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.

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