diff options
author | Ola Aunronning <olaa@yahooinc.com> | 2024-04-08 13:52:44 +0200 |
---|---|---|
committer | Arne Juul <arnej@vespa.ai> | 2024-04-12 14:14:10 +0000 |
commit | 1e51fba9cbf5c7bd2480a9df7de56287ec82d848 (patch) | |
tree | 63662bf32c6d302c3f80135bafff07755675889e | |
parent | ba03495a7e60872ca3ab1f5e8c915df4921f5c5e (diff) |
Otel on logserver WIP
11 files changed, 150 insertions, 2 deletions
diff --git a/config-model-api/abi-spec.json b/config-model-api/abi-spec.json index 3fefd05bd55..c416a5e3a0b 100644 --- a/config-model-api/abi-spec.json +++ b/config-model-api/abi-spec.json @@ -1325,7 +1325,8 @@ "public int searchHandlerThreadpool()", "public boolean alwaysMarkPhraseExpensive()", "public boolean sortBlueprintsByCost()", - "public int persistenceThreadMaxFeedOpBatchSize()" + "public int persistenceThreadMaxFeedOpBatchSize()", + "public boolean logserverOtelCol()" ], "fields" : [ ] }, @@ -1861,4 +1862,4 @@ "public final java.lang.String serviceName" ] } -}
\ No newline at end of file +} diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java index de71c700741..ad5ab5b7ee4 100644 --- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java +++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java @@ -113,6 +113,7 @@ public interface ModelContext { @ModelFeatureFlag(owners = {"baldersheim"}) default boolean alwaysMarkPhraseExpensive() { return false; } @ModelFeatureFlag(owners = {"baldersheim"}) default boolean sortBlueprintsByCost() { return false; } @ModelFeatureFlag(owners = {"vekterli"}) default int persistenceThreadMaxFeedOpBatchSize() { return 1; } + @ModelFeatureFlag(owners = {"olaa"}) default boolean logserverOtelCol() { return false; } } /** Warning: As elsewhere in this package, do not make backwards incompatible changes that will break old config models! */ diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java index 51c78ee796c..3c45588a054 100644 --- a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java +++ b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java @@ -83,6 +83,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea private List<DataplaneToken> dataplaneTokens; private int contentLayerMetadataFeatureLevel = 0; private int persistenceThreadMaxFeedOpBatchSize = 1; + private boolean logserverOtelCol = false; @Override public ModelContext.FeatureFlags featureFlags() { return this; } @Override public boolean multitenant() { return multitenant; } @@ -140,6 +141,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea @Override public List<DataplaneToken> dataplaneTokens() { return dataplaneTokens; } @Override public int contentLayerMetadataFeatureLevel() { return contentLayerMetadataFeatureLevel; } @Override public int persistenceThreadMaxFeedOpBatchSize() { return persistenceThreadMaxFeedOpBatchSize; } + @Override public boolean logserverOtelCol() { return logserverOtelCol; } public TestProperties sharedStringRepoNoReclaim(boolean sharedStringRepoNoReclaim) { this.sharedStringRepoNoReclaim = sharedStringRepoNoReclaim; @@ -375,6 +377,11 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea return this; } + public TestProperties setLogserverOtelCol(boolean logserverOtelCol) { + this.logserverOtelCol = logserverOtelCol; + return this; + } + public static class Spec implements ConfigServerSpec { private final String hostName; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java index 654c81f0519..629ce54d9dd 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java @@ -5,6 +5,8 @@ import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.TreeConfigProducer; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.search.config.QrStartConfig; +import com.yahoo.vespa.model.admin.otel.OpenTelemetryCollector; +import com.yahoo.vespa.model.admin.otel.OpenTelemetryConfigGenerator; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.PlatformBundles; import com.yahoo.vespa.model.container.component.Handler; @@ -29,6 +31,7 @@ public class LogserverContainerCluster extends ContainerCluster<LogserverContain setJvmGCOptions(deployState.getProperties().jvmGCOptions(Optional.of(ClusterSpec.Type.admin))); if (isHostedVespa()) addAccessLog(getName()); + } @Override diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/otel/OpenTelemetryCollector.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/otel/OpenTelemetryCollector.java new file mode 100644 index 00000000000..71e2a670034 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/otel/OpenTelemetryCollector.java @@ -0,0 +1,43 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.admin.otel; + +import com.yahoo.cloud.config.OpenTelemetryConfig; +import com.yahoo.config.model.producer.TreeConfigProducer; +import com.yahoo.vespa.model.AbstractService; +import com.yahoo.vespa.model.PortAllocBridge; + +import java.util.Optional; + +public class OpenTelemetryCollector extends AbstractService implements OpenTelemetryConfig.Producer { + + private final String config; + + public OpenTelemetryCollector(TreeConfigProducer<?> parent, String config) { + super(parent, "otelcol"); + setProp("clustertype", "admin"); + setProp("clustername", "admin"); + this.config = config; + } + + /** + * @return the startup command for the otelcol wrapper + */ + @Override + public Optional<String> getStartupCommand() { + return Optional.of("exec $ROOT/bin/vespa-otelcol-start"); + } + + + @Override + public void allocatePorts(int start, PortAllocBridge from) {} + + @Override + public int getPortCount() { + return 0; + } + + @Override + public void getConfig(OpenTelemetryConfig.Builder builder) { + builder.config(config); + } +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/otel/OpenTelemetryConfigGenerator.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/otel/OpenTelemetryConfigGenerator.java new file mode 100644 index 00000000000..7d18cf36f58 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/otel/OpenTelemetryConfigGenerator.java @@ -0,0 +1,46 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.admin.otel; + +/** + * @author olaa + */ +public class OpenTelemetryConfigGenerator { + + // For now - just create dummy config + /* + TODO: Create config + 1. polling /state/v1 handler of every service + 2. Processing with mapping/filtering from metric sets + 3. Exporter to correct endpoint (alternatively amended) + */ + public static String generate() { + + return """ + receivers: + prometheus_simple: + collection_interval: 60s + endpoint: 'localhost:4080' + metrics_path: '/state/v1/metrics + params: + format: 'prometheus' + tls: + ca_file: '/opt/vespa/var/vespa//trust-store.pem' + cert_file: '/var/lib/sia/certs/vespa.external.cd.tenant.cert.pem' + insecure_skip_verify: true + key_file: '/var/lib/sia/keys/vespa.external.cd.tenant.key.pem' + exporters: + file: + path: /opt/vespa/logs/vespa/otel-test.json + rotation: + max_megabytes: 10 + max_days: 3 + max_backups: 1 + service: + pipelines: + metrics: + receivers: [ prometheus_simple ] + processors: [ ] + exporters: [ file ] + """; + } +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java index f722cf375f3..79866980170 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.model.builder.xml.dom; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.config.model.producer.TreeConfigProducer; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.vespa.model.HostResource; import com.yahoo.vespa.model.HostSystem; @@ -12,6 +13,8 @@ import com.yahoo.vespa.model.admin.Logserver; import com.yahoo.vespa.model.admin.LogserverContainer; import com.yahoo.vespa.model.admin.LogserverContainerCluster; import com.yahoo.vespa.model.admin.Slobrok; +import com.yahoo.vespa.model.admin.otel.OpenTelemetryCollector; +import com.yahoo.vespa.model.admin.otel.OpenTelemetryConfigGenerator; import com.yahoo.vespa.model.container.Container; import com.yahoo.vespa.model.container.ContainerModel; import org.w3c.dom.Element; @@ -113,9 +116,18 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { logServerCluster.addContainer(container); admin.addAndInitializeService(deployState, hostResource, container); admin.setLogserverContainerCluster(logServerCluster); + if (deployState.featureFlags().logserverOtelCol()) + addOtelcol(admin, deployState, hostResource); context.getConfigModelRepoAdder().add(logserverClusterModel); } + + private void addOtelcol(TreeConfigProducer<?> parent, DeployState deployState, HostResource hostResource) { + var otelcol = new OpenTelemetryCollector(parent, OpenTelemetryConfigGenerator.generate()); + otelcol.setHostResource(hostResource); + otelcol.initService(deployState); + } + private Collection<HostResource> allocateHosts(HostSystem hostSystem, String clusterId, NodesSpecification nodesSpecification) { return nodesSpecification.provision(hostSystem, ClusterSpec.Type.admin, diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java index 326fb633877..8265dac9751 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java @@ -212,6 +212,27 @@ public class DedicatedAdminV4Test { METRICS_PROXY_CONTAINER.serviceName, LOGSERVER_CONTAINER.serviceName); } + @Test + void testOtelServiceWhenFeatureFlagEnabled() throws Exception { + String services = "<services>" + + " <admin version='4.0'>" + + " <logservers>" + + " <nodes count='1' dedicated='true'/>" + + " </logservers>" + + " </admin>" + + "</services>"; + + VespaModel model = createModel(hosts, services, new DeployState.Builder() + .zone(new Zone(SystemName.Public, Environment.dev, RegionName.defaultName())) + .properties(new TestProperties() + .setLogserverOtelCol(true) + .setHostedVespa(true))); + assertEquals(1, model.getHosts().size()); + // Should create a logserver container on the same node as logserver + assertHostContainsServices(model, "hosts/myhost0", "slobrok", "logd", "logserver", "opentelemetrycollector", + METRICS_PROXY_CONTAINER.serviceName, LOGSERVER_CONTAINER.serviceName); + } + private Set<String> serviceNames(VespaModel model, String hostname) { SentinelConfig config = model.getConfig(SentinelConfig.class, hostname); return config.service().stream().map(SentinelConfig.Service::name).collect(Collectors.toSet()); diff --git a/configdefinitions/src/vespa/open-telemetry.def b/configdefinitions/src/vespa/open-telemetry.def new file mode 100644 index 00000000000..15a0e92b32c --- /dev/null +++ b/configdefinitions/src/vespa/open-telemetry.def @@ -0,0 +1,5 @@ +# Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +namespace=cloud.config + +# For now - store entire config in one string +config string diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java index 2750279919d..7189ae12c66 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java @@ -207,6 +207,7 @@ public class ModelContextImpl implements ModelContext { private final String unknownConfigDefinition; private final int searchHandlerThreadpool; private final int persistenceThreadMaxFeedOpBatchSize; + private final boolean logserverOtelCol; public FeatureFlags(FlagSource source, ApplicationId appId, Version version) { this.defaultTermwiseLimit = flagValue(source, appId, version, Flags.DEFAULT_TERM_WISE_LIMIT); @@ -250,6 +251,7 @@ public class ModelContextImpl implements ModelContext { this.alwaysMarkPhraseExpensive = flagValue(source, appId, version, Flags.ALWAYS_MARK_PHRASE_EXPENSIVE); this.sortBlueprintsByCost = flagValue(source, appId, version, Flags.SORT_BLUEPRINTS_BY_COST); this.persistenceThreadMaxFeedOpBatchSize = flagValue(source, appId, version, Flags.PERSISTENCE_THREAD_MAX_FEED_OP_BATCH_SIZE); + this.logserverOtelCol = flagValue(source, appId, version, Flags.LOGSERVER_OTELCOL_AGENT); } @Override public int heapSizePercentage() { return heapPercentage; } @@ -301,6 +303,7 @@ public class ModelContextImpl implements ModelContext { @Override public int searchHandlerThreadpool() { return searchHandlerThreadpool; } @Override public boolean sortBlueprintsByCost() { return sortBlueprintsByCost; } @Override public int persistenceThreadMaxFeedOpBatchSize() { return persistenceThreadMaxFeedOpBatchSize; } + @Override public boolean logserverOtelCol() { return logserverOtelCol; } private static <V> V flagValue(FlagSource source, ApplicationId appId, Version vespaVersion, UnboundFlag<? extends V, ?, ?> flag) { return flag.bindTo(source) diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java index befd66c83b0..ba7775b1790 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -437,6 +437,12 @@ public class Flags { "Takes effect at redeployment", INSTANCE_ID); + public static UnboundBooleanFlag LOGSERVER_OTELCOL_AGENT = defineFeatureFlag( + "logserver-otelcol-agent", false, + List.of("olaa"), "2024-04-03", "2024-12-31", + "Whether logserver container should run otel agent", + "Takes effect at redeployment", INSTANCE_ID); + /** WARNING: public for testing: All flags should be defined in {@link Flags}. */ public static UnboundBooleanFlag defineFeatureFlag(String flagId, boolean defaultValue, List<String> owners, String createdAt, String expiresAt, String description, |