Skip to content

Commit 4da4f66

Browse files
authored
Add user-specified instrumentation volume (#3285)
* feat(vol): add custom instr volume spec * feat(vol): generate code * feat(vol): add unit test * feat(vol): update api docs * fix(vol): fix unit test * feat(vol): move validation to webhook * feat(vol): add e2e test * feat(vol): update bundle * fix(vol): fix bundle * feat(vol): add validation unit tests * meta: add changelog * feat: add ephemeral volume option * meta: update changelog * feat: generate * feat: adjust tests * feat: regenerate * fix: fix e2e volume test * feat: update manifest * fix: e2e test
1 parent 70dff69 commit 4da4f66

21 files changed

+6978
-907
lines changed

.chloggen/3267-custom-instr-vol.yaml

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: enhancement
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: auto-instrumentation
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: Adds VolumeClaimTemplate field to Instrumentation spec to enable user-definable ephemeral volumes for auto-instrumentation.
9+
10+
# One or more tracking issues related to the change
11+
issues: [3267]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext:

apis/v1alpha1/instrumentation_types.go

+28
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ type Java struct {
162162
// +optional
163163
Image string `json:"image,omitempty"`
164164

165+
// VolumeClaimTemplate defines a ephemeral volume used for auto-instrumentation.
166+
// If omitted, an emptyDir is used with size limit VolumeSizeLimit
167+
VolumeClaimTemplate corev1.PersistentVolumeClaimTemplate `json:"volumeClaimTemplate,omitempty"`
168+
165169
// VolumeSizeLimit defines size limit for volume used for auto-instrumentation.
166170
// The default size is 200Mi.
167171
VolumeSizeLimit *resource.Quantity `json:"volumeLimitSize,omitempty"`
@@ -196,6 +200,10 @@ type NodeJS struct {
196200
// +optional
197201
Image string `json:"image,omitempty"`
198202

203+
// VolumeClaimTemplate defines a ephemeral volume used for auto-instrumentation.
204+
// If omitted, an emptyDir is used with size limit VolumeSizeLimit
205+
VolumeClaimTemplate corev1.PersistentVolumeClaimTemplate `json:"volumeClaimTemplate,omitempty"`
206+
199207
// VolumeSizeLimit defines size limit for volume used for auto-instrumentation.
200208
// The default size is 200Mi.
201209
VolumeSizeLimit *resource.Quantity `json:"volumeLimitSize,omitempty"`
@@ -217,6 +225,10 @@ type Python struct {
217225
// +optional
218226
Image string `json:"image,omitempty"`
219227

228+
// VolumeClaimTemplate defines a ephemeral volume used for auto-instrumentation.
229+
// If omitted, an emptyDir is used with size limit VolumeSizeLimit
230+
VolumeClaimTemplate corev1.PersistentVolumeClaimTemplate `json:"volumeClaimTemplate,omitempty"`
231+
220232
// VolumeSizeLimit defines size limit for volume used for auto-instrumentation.
221233
// The default size is 200Mi.
222234
VolumeSizeLimit *resource.Quantity `json:"volumeLimitSize,omitempty"`
@@ -238,6 +250,10 @@ type DotNet struct {
238250
// +optional
239251
Image string `json:"image,omitempty"`
240252

253+
// VolumeClaimTemplate defines a ephemeral volume used for auto-instrumentation.
254+
// If omitted, an emptyDir is used with size limit VolumeSizeLimit
255+
VolumeClaimTemplate corev1.PersistentVolumeClaimTemplate `json:"volumeClaimTemplate,omitempty"`
256+
241257
// VolumeSizeLimit defines size limit for volume used for auto-instrumentation.
242258
// The default size is 200Mi.
243259
VolumeSizeLimit *resource.Quantity `json:"volumeLimitSize,omitempty"`
@@ -257,6 +273,10 @@ type Go struct {
257273
// +optional
258274
Image string `json:"image,omitempty"`
259275

276+
// VolumeClaimTemplate defines a ephemeral volume used for auto-instrumentation.
277+
// If omitted, an emptyDir is used with size limit VolumeSizeLimit
278+
VolumeClaimTemplate corev1.PersistentVolumeClaimTemplate `json:"volumeClaimTemplate,omitempty"`
279+
260280
// VolumeSizeLimit defines size limit for volume used for auto-instrumentation.
261281
// The default size is 200Mi.
262282
VolumeSizeLimit *resource.Quantity `json:"volumeLimitSize,omitempty"`
@@ -278,6 +298,10 @@ type ApacheHttpd struct {
278298
// +optional
279299
Image string `json:"image,omitempty"`
280300

301+
// VolumeClaimTemplate defines a ephemeral volume used for auto-instrumentation.
302+
// If omitted, an emptyDir is used with size limit VolumeSizeLimit
303+
VolumeClaimTemplate corev1.PersistentVolumeClaimTemplate `json:"volumeClaimTemplate,omitempty"`
304+
281305
// VolumeSizeLimit defines size limit for volume used for auto-instrumentation.
282306
// The default size is 200Mi.
283307
VolumeSizeLimit *resource.Quantity `json:"volumeLimitSize,omitempty"`
@@ -314,6 +338,10 @@ type Nginx struct {
314338
// +optional
315339
Image string `json:"image,omitempty"`
316340

341+
// VolumeClaimTemplate defines a ephemeral volume used for auto-instrumentation.
342+
// If omitted, an emptyDir is used with size limit VolumeSizeLimit
343+
VolumeClaimTemplate corev1.PersistentVolumeClaimTemplate `json:"volumeClaimTemplate,omitempty"`
344+
317345
// VolumeSizeLimit defines size limit for volume used for auto-instrumentation.
318346
// The default size is 200Mi.
319347
VolumeSizeLimit *resource.Quantity `json:"volumeLimitSize,omitempty"`

apis/v1alpha1/instrumentation_webhook.go

+38
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package v1alpha1
1717
import (
1818
"context"
1919
"fmt"
20+
"reflect"
2021
"strconv"
2122
"strings"
2223

@@ -237,6 +238,36 @@ func (w InstrumentationWebhook) validate(r *Instrumentation) (admission.Warnings
237238
return warnings, fmt.Errorf("spec.sampler.type is not valid: %s", r.Spec.Sampler.Type)
238239
}
239240

241+
var err error
242+
err = validateInstrVolume(r.Spec.ApacheHttpd.VolumeClaimTemplate, r.Spec.ApacheHttpd.VolumeSizeLimit)
243+
if err != nil {
244+
return warnings, fmt.Errorf("spec.apachehttpd.volumeClaimTemplate and spec.apachehttpd.volumeSizeLimit cannot both be defined: %w", err)
245+
}
246+
err = validateInstrVolume(r.Spec.DotNet.VolumeClaimTemplate, r.Spec.DotNet.VolumeSizeLimit)
247+
if err != nil {
248+
return warnings, fmt.Errorf("spec.dotnet.volumeClaimTemplate and spec.dotnet.volumeSizeLimit cannot both be defined: %w", err)
249+
}
250+
err = validateInstrVolume(r.Spec.Go.VolumeClaimTemplate, r.Spec.Go.VolumeSizeLimit)
251+
if err != nil {
252+
return warnings, fmt.Errorf("spec.go.volumeClaimTemplate and spec.go.volumeSizeLimit cannot both be defined: %w", err)
253+
}
254+
err = validateInstrVolume(r.Spec.Java.VolumeClaimTemplate, r.Spec.Java.VolumeSizeLimit)
255+
if err != nil {
256+
return warnings, fmt.Errorf("spec.java.volumeClaimTemplate and spec.java.volumeSizeLimit cannot both be defined: %w", err)
257+
}
258+
err = validateInstrVolume(r.Spec.Nginx.VolumeClaimTemplate, r.Spec.Nginx.VolumeSizeLimit)
259+
if err != nil {
260+
return warnings, fmt.Errorf("spec.nginx.volumeClaimTemplate and spec.nginx.volumeSizeLimit cannot both be defined: %w", err)
261+
}
262+
err = validateInstrVolume(r.Spec.NodeJS.VolumeClaimTemplate, r.Spec.NodeJS.VolumeSizeLimit)
263+
if err != nil {
264+
return warnings, fmt.Errorf("spec.nodejs.volumeClaimTemplate and spec.nodejs.volumeSizeLimit cannot both be defined: %w", err)
265+
}
266+
err = validateInstrVolume(r.Spec.Python.VolumeClaimTemplate, r.Spec.Python.VolumeSizeLimit)
267+
if err != nil {
268+
return warnings, fmt.Errorf("spec.python.volumeClaimTemplate and spec.python.volumeSizeLimit cannot both be defined: %w", err)
269+
}
270+
240271
warnings = append(warnings, validateExporter(r.Spec.Exporter)...)
241272

242273
return warnings, nil
@@ -292,6 +323,13 @@ func validateJaegerRemoteSamplerArgument(argument string) error {
292323
return nil
293324
}
294325

326+
func validateInstrVolume(volumeClaimTemplate corev1.PersistentVolumeClaimTemplate, volumeSizeLimit *resource.Quantity) error {
327+
if !reflect.ValueOf(volumeClaimTemplate).IsZero() && volumeSizeLimit != nil {
328+
return fmt.Errorf("unable to resolve volume size")
329+
}
330+
return nil
331+
}
332+
295333
func NewInstrumentationWebhook(logger logr.Logger, scheme *runtime.Scheme, cfg config.Config) *InstrumentationWebhook {
296334
return &InstrumentationWebhook{
297335
logger: logger,

apis/v1alpha1/instrumentation_webhook_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@ import (
1919
"testing"
2020

2121
"github.com/stretchr/testify/assert"
22+
corev1 "k8s.io/api/core/v1"
23+
"k8s.io/apimachinery/pkg/api/resource"
2224
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
2325

2426
"github.com/open-telemetry/opentelemetry-operator/internal/config"
2527
)
2628

29+
var defaultVolumeSize = resource.MustParse("200Mi")
30+
2731
func TestInstrumentationDefaultingWebhook(t *testing.T) {
2832
inst := &Instrumentation{}
2933
err := InstrumentationWebhook{
@@ -113,6 +117,23 @@ func TestInstrumentationValidatingWebhook(t *testing.T) {
113117
},
114118
},
115119
},
120+
{
121+
name: "with volume and volumeSizeLimit",
122+
err: "spec.nodejs.volumeClaimTemplate and spec.nodejs.volumeSizeLimit cannot both be defined",
123+
inst: Instrumentation{
124+
Spec: InstrumentationSpec{
125+
NodeJS: NodeJS{
126+
VolumeClaimTemplate: corev1.PersistentVolumeClaimTemplate{
127+
Spec: corev1.PersistentVolumeClaimSpec{
128+
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
129+
},
130+
},
131+
VolumeSizeLimit: &defaultVolumeSize,
132+
},
133+
},
134+
},
135+
warnings: []string{"sampler type not set"},
136+
},
116137
{
117138
name: "exporter: tls cert set but missing key",
118139
inst: Instrumentation{

apis/v1alpha1/zz_generated.deepcopy.go

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)