Skip to content

Commit

Permalink
fixes for observability to be autonomous
Browse files Browse the repository at this point in the history
  • Loading branch information
danielGz committed Feb 1, 2025
1 parent 5f87a1f commit 91603dd
Show file tree
Hide file tree
Showing 38 changed files with 343 additions and 139 deletions.
12 changes: 12 additions & 0 deletions kork-actuator/kork-actuator.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

apply plugin: "java-library"
apply from: "$rootDir/gradle/kotlin-test.gradle"
apply from: "$rootDir/gradle/lombok.gradle"

dependencies {
compileOnly(platform(project(":spinnaker-dependencies")))
Expand All @@ -25,9 +26,20 @@ dependencies {
implementation "org.springframework.boot:spring-boot-starter-security"
implementation "org.springframework.boot:spring-boot-starter-web"
compileOnly "org.springframework.boot:spring-boot-starter-actuator"
compileOnly "org.projectlombok:lombok"
testImplementation "org.spockframework:spock-core"
testImplementation "org.spockframework:spock-spring"
testImplementation "org.springframework.boot:spring-boot-starter-test"
testRuntimeOnly "cglib:cglib-nodep"
testRuntimeOnly "org.objenesis:objenesis"

implementation("io.micrometer:micrometer-registry-prometheus") {
exclude group: 'io.micrometer', module: 'micrometer-core'
}
implementation('io.micrometer:micrometer-registry-datadog') {
exclude group: 'io.micrometer', module: 'micrometer-core'
}
implementation('com.newrelic.telemetry:micrometer-registry-new-relic:0.5.0') {
exclude group: 'io.micrometer', module: 'micrometer-core'
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
/*
* Copyright 2025 Netflix, Inc.
*
* 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 com.netflix.spinnaker.kork.actuator.observability.config;

import io.micrometer.core.instrument.Clock;
import io.prometheus.client.CollectorRegistry;
import java.util.Collection;
import java.util.function.Supplier;
import lombok.extern.slf4j.Slf4j;
import com.netflix.spinnaker.kork.actuator.observability.datadog.DataDogRegistrySupplier;
import com.netflix.spinnaker.kork.actuator.observability.model.ObservabilityConfigurationProperites;
import com.netflix.spinnaker.kork.actuator.observability.newrelic.NewRelicRegistrySupplier;
import com.netflix.spinnaker.kork.actuator.observability.prometheus.PrometheusRegistrySupplier;
import com.netflix.spinnaker.kork.actuator.observability.prometheus.PrometheusScrapeEndpoint;
import com.netflix.spinnaker.kork.actuator.observability.registry.AddDefaultTagsRegistryCustomizer;
import com.netflix.spinnaker.kork.actuator.observability.registry.AddFiltersRegistryCustomizer;
import com.netflix.spinnaker.kork.actuator.observability.registry.ArmoryObservabilityCompositeRegistry;
import com.netflix.spinnaker.kork.actuator.observability.registry.RegistryConfigWrapper;
import com.netflix.spinnaker.kork.actuator.observability.registry.RegistryCustomizer;
import com.netflix.spinnaker.kork.actuator.observability.service.MeterFilterService;
import com.netflix.spinnaker.kork.actuator.observability.service.TagsService;
import com.netflix.spinnaker.kork.actuator.observability.version.SpringPackageVersionResolver;
import com.netflix.spinnaker.kork.actuator.observability.version.VersionResolver;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

@Slf4j
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE + 66)
@ConditionalOnProperty(name = "observability.enabled", havingValue = "true")
public class ObservabilityConfiguration {

public ObservabilityConfiguration() {
log.info("Observability enabled");
}

@Bean
public ObservabilityConfigurationProperites observabilityConfigurationProperites() {
return new ObservabilityConfigurationProperites();
}

@Bean
@ConditionalOnMissingBean(VersionResolver.class)
public static VersionResolver versionResolver(ApplicationContext applicationContext) {
return new SpringPackageVersionResolver(applicationContext);
}

@Bean
public TagsService tagsService(
ObservabilityConfigurationProperites observabilityConfigurationProperites,
VersionResolver versionResolver,
@Value("${spring.application.name:#{null}}") String springInjectedApplicationName) {
return new TagsService(
observabilityConfigurationProperites, versionResolver, springInjectedApplicationName);
}

@Bean
public AddDefaultTagsRegistryCustomizer addDefaultTagsRegistryCustomizer(
TagsService tagsService) {
return new AddDefaultTagsRegistryCustomizer(tagsService);
}

@Bean
public MeterFilterService meterFilterService() {
return new MeterFilterService();
}

@Bean
public AddFiltersRegistryCustomizer addFiltersRegistryCustomizer(
MeterFilterService meterFilterService) {
return new AddFiltersRegistryCustomizer(meterFilterService);
}

@Bean
public CollectorRegistry collectorRegistry() {
return new CollectorRegistry();
}

@Bean
public PrometheusRegistrySupplier prometheusRegistrySupplier(
ObservabilityConfigurationProperites pluginConfig,
CollectorRegistry collectorRegistry,
Clock clock) {
return new PrometheusRegistrySupplier(pluginConfig, collectorRegistry, clock);
}

@Bean
@Primary
public ArmoryObservabilityCompositeRegistry armoryObservabilityCompositeRegistry(
Clock clock,
Collection<Supplier<RegistryConfigWrapper>> registrySuppliers,
Collection<RegistryCustomizer> meterRegistryCustomizers) {
return new ArmoryObservabilityCompositeRegistry(
clock, registrySuppliers, meterRegistryCustomizers);
}

@Bean
public PrometheusScrapeEndpoint prometheusScrapeEndpoint(CollectorRegistry collectorRegistry)
{
return new PrometheusScrapeEndpoint(collectorRegistry);
}

@Bean
public DataDogRegistrySupplier dataDogRegistrySupplier(
@NotNull ObservabilityConfigurationProperites pluginConfig) {
return new DataDogRegistrySupplier(pluginConfig);
}

@Bean
public NewRelicRegistrySupplier newRelicRegistrySupplier(
ObservabilityConfigurationProperites pluginConfig, TagsService tagsService) {
return new NewRelicRegistrySupplier(pluginConfig, tagsService);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.datadog;
package com.netflix.spinnaker.kork.actuator.observability.datadog;

import com.netflix.spinnaker.kork.observability.model.MetricsDatadogConfig;
import java.util.Optional;
import com.netflix.spinnaker.kork.actuator.observability.model.MetricsDatadogConfig;

public class DataDogRegistryConfig implements io.micrometer.datadog.DatadogConfig {
private final MetricsDatadogConfig datadogConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,17 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.datadog;
package com.netflix.spinnaker.kork.actuator.observability.datadog;

import com.netflix.spinnaker.kork.observability.model.MetricsDatadogConfig;
import com.netflix.spinnaker.kork.observability.model.ObservabilityConfigurationProperites;
import com.netflix.spinnaker.kork.observability.registry.RegistryConfigWrapper;
import io.micrometer.core.ipc.http.HttpUrlConnectionSender;
import io.micrometer.datadog.DatadogMeterRegistry;
import java.time.Duration;
import java.util.function.Supplier;
import com.netflix.spinnaker.kork.actuator.observability.model.MetricsDatadogConfig;
import com.netflix.spinnaker.kork.actuator.observability.model.ObservabilityConfigurationProperites;
import com.netflix.spinnaker.kork.actuator.observability.registry.RegistryConfigWrapper;
import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DataDogRegistrySupplier implements Supplier<RegistryConfigWrapper> {

private final MetricsDatadogConfig datadogConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.filters;
package com.netflix.spinnaker.kork.actuator.observability.filters;

import static com.netflix.spinnaker.kork.observability.filters.Filters.DENY_CONTROLLER_INVOCATIONS_METRICS;
import static com.netflix.spinnaker.kork.actuator.observability.filters.Filters.DENY_CONTROLLER_INVOCATIONS_METRICS;

import io.micrometer.core.instrument.config.MeterFilter;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
package com.netflix.spinnaker.kork.observability.filters;
/*
* Copyright 2025 Netflix, Inc.
*
* 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 com.netflix.spinnaker.kork.actuator.observability.filters;

import io.micrometer.core.instrument.config.MeterFilter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.model;
package com.netflix.spinnaker.kork.actuator.observability.model;

import lombok.Builder;
import lombok.Data;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.model;
package com.netflix.spinnaker.kork.actuator.observability.model;

import java.util.List;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.model;
package com.netflix.spinnaker.kork.actuator.observability.model;

import java.util.Map;
import lombok.Data;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.model;
package com.netflix.spinnaker.kork.actuator.observability.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.model;
package com.netflix.spinnaker.kork.actuator.observability.model;

import lombok.Data;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.model;
package com.netflix.spinnaker.kork.actuator.observability.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.model;
package com.netflix.spinnaker.kork.actuator.observability.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.model;
package com.netflix.spinnaker.kork.actuator.observability.model;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,12 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.newrelic;
package com.netflix.spinnaker.kork.actuator.observability.newrelic;

import com.netflix.spinnaker.kork.observability.model.MetricsNewRelicConfig;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.Optional;
import org.pf4j.PluginRuntimeException;
import com.netflix.spinnaker.kork.actuator.observability.model.MetricsNewRelicConfig;

/**
* New Relic config wrapper that sources its config from the Spring Context Plugin Configuration.
Expand All @@ -43,8 +42,7 @@ public String apiKey() {
return Optional.ofNullable(newRelicConfig.getApiKey())
.orElseThrow(
() ->
new PluginRuntimeException(
"The New Relic API key is a required plugin config property"));
new RuntimeException("The New Relic API key is a required plugin config property"));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,8 @@
* limitations under the License.
*/

package com.netflix.spinnaker.kork.observability.newrelic;
package com.netflix.spinnaker.kork.actuator.observability.newrelic;

import com.netflix.spinnaker.kork.observability.model.MetricsNewRelicConfig;
import com.netflix.spinnaker.kork.observability.model.ObservabilityConfigurationProperites;
import com.netflix.spinnaker.kork.observability.registry.RegistryConfigWrapper;
import com.netflix.spinnaker.kork.observability.service.TagsService;
import io.micrometer.core.ipc.http.HttpUrlConnectionSender;
import io.micrometer.newrelic.NewRelicRegistry;
import java.net.InetSocketAddress;
Expand All @@ -28,14 +24,16 @@
import java.util.List;
import java.util.concurrent.Executors;
import java.util.function.Supplier;
import org.springframework.context.annotation.Configuration;
import com.netflix.spinnaker.kork.actuator.observability.model.MetricsNewRelicConfig;
import com.netflix.spinnaker.kork.actuator.observability.model.ObservabilityConfigurationProperites;
import com.netflix.spinnaker.kork.actuator.observability.registry.RegistryConfigWrapper;
import com.netflix.spinnaker.kork.actuator.observability.service.TagsService;

/**
* A Supplier bean that can be registered with Spring without providing an actual registry
* implementation to confuse Spectator/Micrometer. This Supplier configures a New Relic Micrometer
* Registry Instance.
*/
@Configuration
public class NewRelicRegistrySupplier implements Supplier<RegistryConfigWrapper> {

protected HttpUrlConnectionSender sender;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,23 @@
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micrometer.prometheus;
package com.netflix.spinnaker.kork.actuator.observability.prometheus;

import static java.util.stream.Collectors.toList;

import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.config.NamingConvention;
import io.micrometer.prometheus.PrometheusConfig;
import io.prometheus.client.Collector;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Stream;

Expand Down
Loading

0 comments on commit 91603dd

Please sign in to comment.