-
Notifications
You must be signed in to change notification settings - Fork 345
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 Elasticsearch index cleaner as cron job #155
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -126,6 +126,7 @@ type JaegerStorageSpec struct { | |
Options Options `json:"options"` | ||
CassandraCreateSchema JaegerCassandraCreateSchemaSpec `json:"cassandraCreateSchema"` | ||
SparkDependencies JaegerDependenciesSpec `json:"dependencies"` | ||
EsIndexCleaner JaegerEsIndexCleanerSpec `json:"esIndexCleaner"` | ||
} | ||
|
||
// JaegerCassandraCreateSchemaSpec holds the options related to the create-schema batch job | ||
|
@@ -150,6 +151,14 @@ type JaegerDependenciesSpec struct { | |
ElasticsearchNodesWanOnly bool `json:"elasticsearchNodesWanOnly"` | ||
} | ||
|
||
// JaegerEsIndexCleanerSpec holds the options related to es-index-cleaner | ||
type JaegerEsIndexCleanerSpec struct { | ||
Enabled bool `json:"enabled"` | ||
NumberOfDays int `json:"numberOfDays"` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Used 7 days as default. TTL in c* is 2 day though... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The script supports other configuration properties, see https://github.com/jaegertracing/jaeger/blob/master/plugin/storage/es/esCleaner.py#L11 index prefix, es hostname, I have not exposed them directly but they are derived from storage properties map. |
||
Schedule string `json:"schedule"` | ||
Image string `json:"image"` | ||
} | ||
|
||
func init() { | ||
SchemeBuilder.Register(&Jaeger{}, &JaegerList{}) | ||
} |
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 |
---|---|---|
@@ -0,0 +1,74 @@ | ||
package cronjob | ||
|
||
import ( | ||
"fmt" | ||
"strconv" | ||
"strings" | ||
|
||
batchv1 "k8s.io/api/batch/v1" | ||
batchv1beta1 "k8s.io/api/batch/v1beta1" | ||
"k8s.io/api/core/v1" | ||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||
|
||
"github.com/jaegertracing/jaeger-operator/pkg/apis/io/v1alpha1" | ||
) | ||
|
||
func CreateEsIndexCleaner(jaeger *v1alpha1.Jaeger) *batchv1beta1.CronJob { | ||
esUrls := getEsHostname(jaeger.Spec.Storage.Options.Map()) | ||
trueVar := true | ||
name := fmt.Sprintf("%s-es-index-cleaner", jaeger.Name) | ||
return &batchv1beta1.CronJob{ | ||
ObjectMeta: metav1.ObjectMeta{ | ||
Name: name, | ||
Namespace: jaeger.Namespace, | ||
OwnerReferences: []metav1.OwnerReference{ | ||
{ | ||
APIVersion: jaeger.APIVersion, | ||
Kind: jaeger.Kind, | ||
Name: jaeger.Name, | ||
UID: jaeger.UID, | ||
Controller: &trueVar, | ||
}, | ||
}, | ||
}, | ||
Spec: batchv1beta1.CronJobSpec{ | ||
Schedule: jaeger.Spec.Storage.EsIndexCleaner.Schedule, | ||
JobTemplate: batchv1beta1.JobTemplateSpec{ | ||
Spec: batchv1.JobSpec{ | ||
Template: v1.PodTemplateSpec{ | ||
Spec: v1.PodSpec{ | ||
Containers: []v1.Container{ | ||
{ | ||
Image: jaeger.Spec.Storage.EsIndexCleaner.Image, | ||
Name: name, | ||
Env: []v1.EnvVar{{Name: "INDEX_PREFIX", Value: jaeger.Spec.Storage.Options.Map()["es.index-prefix"]}}, | ||
Args: []string{strconv.Itoa(jaeger.Spec.Storage.EsIndexCleaner.NumberOfDays), esUrls}, | ||
}, | ||
}, | ||
RestartPolicy: v1.RestartPolicyNever, | ||
}, | ||
ObjectMeta: metav1.ObjectMeta{ | ||
Annotations: map[string]string{ | ||
"prometheus.io/scrape": "false", | ||
"sidecar.istio.io/inject": "false", | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
// return first ES hostname from options map | ||
func getEsHostname(opts map[string]string) string { | ||
urls, ok := opts["es.server-urls"] | ||
if !ok { | ||
return "" | ||
} | ||
urlArr := strings.Split(urls, ",") | ||
if len(urlArr) == 0 { | ||
return "" | ||
} | ||
return urlArr[0] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package cronjob | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
|
||
"github.com/jaegertracing/jaeger-operator/pkg/apis/io/v1alpha1" | ||
) | ||
|
||
func TestGetEsHostname(t *testing.T) { | ||
tests := []struct { | ||
underTest map[string]string | ||
hostname string | ||
}{ | ||
{hostname: ""}, | ||
{underTest: map[string]string{"": ""}, hostname: ""}, | ||
{underTest: map[string]string{"es.server-urls": "goo:tar"}, hostname: "goo:tar"}, | ||
{underTest: map[string]string{"es.server-urls": "http://es:9000,https://es2:9200"}, hostname: "http://es:9000"}, | ||
} | ||
for _, test := range tests { | ||
assert.Equal(t, test.hostname, getEsHostname(test.underTest)) | ||
} | ||
} | ||
|
||
func TestCreateEsIndexCleaner(t *testing.T) { | ||
jaeger := &v1alpha1.Jaeger{Spec: v1alpha1.JaegerSpec{Storage: v1alpha1.JaegerStorageSpec{Options: v1alpha1.NewOptions( | ||
map[string]interface{}{"es.index-prefix": "tenant1", "es.server-urls": "http://nowhere:666,foo"})}}} | ||
cronJob := CreateEsIndexCleaner(jaeger) | ||
assert.Equal(t, 2, len(cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Args)) | ||
// default number of days (7) is applied in normalize in controller | ||
assert.Equal(t, []string{"0", "http://nowhere:666"}, cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Args) | ||
assert.Equal(t, 1, len(cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Env)) | ||
assert.Equal(t, "INDEX_PREFIX", cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Env[0].Name) | ||
assert.Equal(t, "tenant1", cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Env[0].Value) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
By default disabled.
I think we should enable it by default along with dependencies job. I would rather do it in a separate PR to keep this minimal.