Skip to content

Commit 8a4ec9f

Browse files
authored
Add engine.workers.capacity metric and rename other engine.worker metrics to engine.workers (#1499)
1 parent cbdedcf commit 8a4ec9f

16 files changed

Lines changed: 229 additions & 79 deletions

File tree

runtime/engine/src/main/java/io/aklivity/zilla/runtime/engine/EngineConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public class EngineConfiguration extends Configuration
110110
EngineConfiguration::decodeHostResolver, EngineConfiguration::defaultHostResolver);
111111
ENGINE_MEMORY_PERCENTAGE = config.property("memory.percentage", 0.25);
112112
ENGINE_DISK_PERCENTAGE = config.property("disk.percentage", 0.75);
113-
ENGINE_WORKER_CAPACITY = config.property("worker.capacity", EngineConfiguration::defaultWorkersCapacity);
113+
ENGINE_WORKER_CAPACITY = config.property("worker.capacity", EngineConfiguration::defaultWorkerCapacity);
114114
ENGINE_BUFFER_POOL_CAPACITY = config.property("buffer.pool.capacity", EngineConfiguration::defaultBufferPoolCapacity);
115115
ENGINE_BUFFER_SLOT_CAPACITY = config.property("buffer.slot.capacity", 32 * 1024);
116116
ENGINE_STREAMS_BUFFER_CAPACITY = config.property("streams.buffer.capacity",
@@ -376,7 +376,7 @@ private static int defaultBudgetsBufferCapacity(
376376
return BudgetsLayout.SIZEOF_BUDGET_ENTRY * ENGINE_WORKER_CAPACITY.getAsInt(config);
377377
}
378378

379-
private static int defaultWorkersCapacity(
379+
private static int defaultWorkerCapacity(
380380
Configuration config)
381381
{
382382
OperatingSystemMXBean osBean = (OperatingSystemMXBean) getOperatingSystemMXBean();

runtime/engine/src/main/java/io/aklivity/zilla/runtime/engine/internal/metrics/EngineMetricGroup.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ public class EngineMetricGroup implements MetricGroup
2929
public static final String NAME = "engine";
3030

3131
private final Map<String, Supplier<Metric>> engineMetrics = Map.of(
32-
EngineWorkerUtilizationMetric.NAME, EngineWorkerUtilizationMetric::new,
33-
EngineWorkerCountMetric.NAME, EngineWorkerCountMetric::new
32+
EngineWorkersUtilizationMetric.NAME, EngineWorkersUtilizationMetric::new,
33+
EngineWorkersCapacityMetric.NAME, EngineWorkersCapacityMetric::new,
34+
EngineWorkersCountMetric.NAME, EngineWorkersCountMetric::new
3435
);
3536

3637
public EngineMetricGroup(

runtime/engine/src/main/java/io/aklivity/zilla/runtime/engine/internal/metrics/EngineWorkerUtilizationMetric.java renamed to runtime/engine/src/main/java/io/aklivity/zilla/runtime/engine/internal/metrics/EngineWorkersCapacityMetric.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
import io.aklivity.zilla.runtime.engine.metrics.Metric;
2020
import io.aklivity.zilla.runtime.engine.metrics.MetricContext;
2121

22-
public final class EngineWorkerUtilizationMetric implements Metric
22+
public class EngineWorkersCapacityMetric implements Metric
2323
{
24-
public static final String NAME = String.format("%s.%s", EngineMetricGroup.NAME, "worker.utilization");
24+
public static final String NAME = String.format("%s.%s", EngineMetricGroup.NAME, "workers.capacity");
2525

26-
private static final String DESCRIPTION = "Engine worker utilization";
26+
private static final String DESCRIPTION = "Engine workers capacity";
2727

2828
@Override
2929
public String name()

runtime/engine/src/main/java/io/aklivity/zilla/runtime/engine/internal/metrics/EngineWorkerCountMetric.java renamed to runtime/engine/src/main/java/io/aklivity/zilla/runtime/engine/internal/metrics/EngineWorkersCountMetric.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
import io.aklivity.zilla.runtime.engine.metrics.Metric;
2020
import io.aklivity.zilla.runtime.engine.metrics.MetricContext;
2121

22-
public class EngineWorkerCountMetric implements Metric
22+
public class EngineWorkersCountMetric implements Metric
2323
{
24-
static final String NAME = String.format("%s.%s", EngineMetricGroup.NAME, "worker.count");
24+
public static final String NAME = String.format("%s.%s", EngineMetricGroup.NAME, "workers.count");
2525

26-
private static final String DESCRIPTION = "Engine worker count";
26+
private static final String DESCRIPTION = "Engine workers count";
2727

2828
@Override
2929
public String name()
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* Copyright 2021-2024 Aklivity Inc.
3+
*
4+
* Aklivity licenses this file to you under the Apache License,
5+
* version 2.0 (the "License"); you may not use this file except in compliance
6+
* with the License. You may obtain a copy of the License at:
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations
14+
* under the License.
15+
*/
16+
package io.aklivity.zilla.runtime.engine.internal.metrics;
17+
18+
import io.aklivity.zilla.runtime.engine.EngineContext;
19+
import io.aklivity.zilla.runtime.engine.metrics.Metric;
20+
import io.aklivity.zilla.runtime.engine.metrics.MetricContext;
21+
22+
public final class EngineWorkersUtilizationMetric implements Metric
23+
{
24+
public static final String NAME = String.format("%s.%s", EngineMetricGroup.NAME, "workers.utilization");
25+
26+
private static final String DESCRIPTION = "Engine workers utilization";
27+
28+
@Override
29+
public String name()
30+
{
31+
return NAME;
32+
}
33+
34+
@Override
35+
public Kind kind()
36+
{
37+
return Kind.GAUGE;
38+
}
39+
40+
@Override
41+
public Unit unit()
42+
{
43+
return Unit.COUNT;
44+
}
45+
46+
@Override
47+
public String description()
48+
{
49+
return DESCRIPTION;
50+
}
51+
52+
@Override
53+
public MetricContext supply(
54+
EngineContext context)
55+
{
56+
//Unsupported metric context
57+
return null;
58+
}
59+
}

runtime/engine/src/main/java/io/aklivity/zilla/runtime/engine/internal/registry/EngineWorker.java

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.aklivity.zilla.runtime.engine.internal.registry;
1717

18+
import static io.aklivity.zilla.runtime.engine.EngineConfiguration.ENGINE_WORKER_CAPACITY;
1819
import static io.aklivity.zilla.runtime.engine.budget.BudgetCreditor.NO_BUDGET_ID;
1920
import static io.aklivity.zilla.runtime.engine.concurrent.Signaler.NO_CANCEL_ID;
2021
import static io.aklivity.zilla.runtime.engine.internal.registry.MetricHandlerKind.ORIGIN;
@@ -126,7 +127,9 @@
126127
import io.aklivity.zilla.runtime.engine.internal.layouts.metrics.CountersLayout;
127128
import io.aklivity.zilla.runtime.engine.internal.layouts.metrics.GaugesLayout;
128129
import io.aklivity.zilla.runtime.engine.internal.layouts.metrics.HistogramsLayout;
129-
import io.aklivity.zilla.runtime.engine.internal.metrics.EngineWorkerUtilizationMetric;
130+
import io.aklivity.zilla.runtime.engine.internal.metrics.EngineWorkersCapacityMetric;
131+
import io.aklivity.zilla.runtime.engine.internal.metrics.EngineWorkersCountMetric;
132+
import io.aklivity.zilla.runtime.engine.internal.metrics.EngineWorkersUtilizationMetric;
130133
import io.aklivity.zilla.runtime.engine.internal.poller.Poller;
131134
import io.aklivity.zilla.runtime.engine.internal.stream.StreamId;
132135
import io.aklivity.zilla.runtime.engine.internal.stream.Target;
@@ -233,6 +236,7 @@ public class EngineWorker implements EngineContext, Agent
233236
private final Supplier<MessageReader> supplyEventReader;
234237
private final EventFormatterFactory eventFormatterFactory;
235238
private final LongSupplier utilizationMetric;
239+
private final boolean readonly;
236240

237241
private long initialId;
238242
private long promiseId;
@@ -244,6 +248,7 @@ public class EngineWorker implements EngineContext, Agent
244248

245249
private volatile Thread thread;
246250

251+
247252
public EngineWorker(
248253
EngineConfiguration config,
249254
ExecutorService executor,
@@ -269,6 +274,7 @@ public EngineWorker(
269274
this.configPath = Path.of(config.configURI());
270275
this.labels = labels;
271276
this.affinityMask = affinityMask;
277+
this.readonly = readonly;
272278

273279
this.supplyIdleStrategy = () -> new BackoffIdleStrategy(
274280
config.maxSpins(),
@@ -301,12 +307,6 @@ public EngineWorker(
301307
metricWriterSuppliers.put(GAUGE, gaugesLayout::supplyWriter);
302308
metricWriterSuppliers.put(HISTOGRAM, histogramsLayout::supplyWriter);
303309

304-
if (!readonly)
305-
{
306-
final int metricId = labels.supplyLabelId("engine.worker.count");
307-
supplyMetricWriter(GAUGE, NO_NAMESPACED_ID, metricId).accept(1);
308-
}
309-
310310
final StreamsLayout streamsLayout = new StreamsLayout.Builder()
311311
.path(config.directory().resolve(String.format("data%d", index)))
312312
.streamsCapacity(config.streamsBufferCapacity())
@@ -467,7 +467,7 @@ public EngineWorker(
467467
this.exportersById = new Long2ObjectHashMap<>();
468468
this.supplyEventReader = supplyEventReader;
469469
this.eventFormatterFactory = eventFormatterFactory;
470-
this.utilizationMetric = supplyGauge(NO_NAMESPACED_ID, labels.supplyLabelId(EngineWorkerUtilizationMetric.NAME));
470+
this.utilizationMetric = supplyGauge(NO_NAMESPACED_ID, labels.supplyLabelId(EngineWorkersUtilizationMetric.NAME));
471471
}
472472

473473
public static int indexOfId(
@@ -780,7 +780,7 @@ public ConverterHandler supplyWriteConverter(
780780
@Override
781781
public LongConsumer supplyUtilizationMetric()
782782
{
783-
final int metricId = labels.supplyLabelId(EngineWorkerUtilizationMetric.NAME);
783+
final int metricId = labels.supplyLabelId(EngineWorkersUtilizationMetric.NAME);
784784

785785
return supplyMetricWriter(GAUGE, NO_NAMESPACED_ID, metricId);
786786
}
@@ -880,6 +880,26 @@ public int doWork()
880880
return workDone;
881881
}
882882

883+
@Override
884+
public void onStart()
885+
{
886+
if (!readonly)
887+
{
888+
int workersMetricId = labels.supplyLabelId(EngineWorkersCountMetric.NAME);
889+
LongConsumer recordCount = supplyMetricWriter(GAUGE, NO_NAMESPACED_ID, workersMetricId);
890+
891+
int capacityMetricId = labels.supplyLabelId(EngineWorkersCapacityMetric.NAME);
892+
LongConsumer recordCapacity = supplyGaugeWriter(capacityMetricId);
893+
894+
int utilizationMetricId = labels.supplyLabelId(EngineWorkersUtilizationMetric.NAME);
895+
LongConsumer recordUtilization = supplyGaugeWriter(utilizationMetricId);
896+
897+
recordCount.accept(1);
898+
recordCapacity.accept(ENGINE_WORKER_CAPACITY.getAsInt(config));
899+
recordUtilization.accept(0);
900+
}
901+
}
902+
883903
@Override
884904
public void onClose()
885905
{
@@ -927,10 +947,13 @@ public void onClose()
927947
acquiredBuffers, acquiredCreditors, acquiredDebitors));
928948
}
929949

930-
long utilization = utilizationMetric.getAsLong();
931-
if (utilization != 0L)
950+
if (!readonly)
932951
{
933-
throw new IllegalStateException("Engine worker utilization is non-zero: %d".formatted(utilization));
952+
long utilization = utilizationMetric.getAsLong();
953+
if (utilization != 0L)
954+
{
955+
throw new IllegalStateException("Engine worker utilization is non-zero: %d".formatted(utilization));
956+
}
934957
}
935958
}
936959

@@ -1031,6 +1054,12 @@ public Metric resolveMetric(
10311054
return metricGroupsByName.get(metricGroupName).supply(metricName);
10321055
}
10331056

1057+
public LongConsumer supplyGaugeWriter(
1058+
long metricId)
1059+
{
1060+
return gaugesLayout.supplyWriter(NO_NAMESPACED_ID, metricId);
1061+
}
1062+
10341063
// required for testing
10351064
public LongConsumer supplyCounterWriter(
10361065
long bindingId,

runtime/engine/src/main/java/io/aklivity/zilla/runtime/engine/metrics/MetricGroupFactory.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@
1515
*/
1616
package io.aklivity.zilla.runtime.engine.metrics;
1717

18-
import static java.util.Collections.unmodifiableMap;
1918
import static java.util.Objects.requireNonNull;
2019
import static java.util.ServiceLoader.load;
2120

22-
import java.util.HashMap;
2321
import java.util.Map;
24-
import java.util.ServiceLoader;
2522

2623
import io.aklivity.zilla.runtime.engine.Configuration;
2724
import io.aklivity.zilla.runtime.engine.factory.Factory;
@@ -51,15 +48,6 @@ public MetricGroup create(
5148
return factorySpi.create(config);
5249
}
5350

54-
private static MetricGroupFactory instantiate(
55-
ServiceLoader<MetricGroupFactorySpi> factories)
56-
{
57-
Map<String, MetricGroupFactorySpi> factorySpisByName = new HashMap<>();
58-
factories.forEach(factorySpi -> factorySpisByName.put(factorySpi.type(), factorySpi));
59-
60-
return new MetricGroupFactory(unmodifiableMap(factorySpisByName));
61-
}
62-
6351
private MetricGroupFactory(
6452
Map<String, MetricGroupFactorySpi> factorySpis)
6553
{

runtime/engine/src/test/java/io/aklivity/zilla/runtime/engine/internal/EngineMetricsIT.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,7 @@ public void shouldFetchGaugeIds()
104104
long[][] gaugeIds = engine.gaugeIds();
105105

106106
// THEN
107-
// gaugeIds[0] is coming from test.gauge in server.yaml
108-
assertThat(gaugeIds[2], equalTo(new long[]{3L, 7L}));
107+
assertThat(gaugeIds[gaugeIds.length - 1], equalTo(new long[]{3L, 7L}));
109108
}
110109

111110
@Test

runtime/engine/src/test/java/io/aklivity/zilla/runtime/engine/test/EngineRule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
import io.aklivity.zilla.runtime.engine.EngineConfiguration;
6161
import io.aklivity.zilla.runtime.engine.binding.Binding;
6262
import io.aklivity.zilla.runtime.engine.ext.EngineExtContext;
63-
import io.aklivity.zilla.runtime.engine.internal.metrics.EngineWorkerUtilizationMetric;
63+
import io.aklivity.zilla.runtime.engine.internal.metrics.EngineWorkersUtilizationMetric;
6464
import io.aklivity.zilla.runtime.engine.test.annotation.Configuration;
6565
import io.aklivity.zilla.runtime.engine.test.annotation.Configure;
6666

@@ -258,7 +258,7 @@ public LongConsumer counterWriter(
258258

259259
public LongSupplier utilization()
260260
{
261-
return gauge(NO_NAMESPACED_ID, supplyLabelId(EngineWorkerUtilizationMetric.NAME));
261+
return gauge(NO_NAMESPACED_ID, supplyLabelId(EngineWorkersUtilizationMetric.NAME));
262262
}
263263

264264
public int supplyLabelId(

runtime/exporter-otlp/pom.xml

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -154,32 +154,6 @@
154154
<outputDirectory>${project.build.directory}/classes</outputDirectory>
155155
</configuration>
156156
</execution>
157-
<execution>
158-
<id>unpack-test-resources</id>
159-
<phase>process-test-resources</phase>
160-
<goals>
161-
<goal>unpack</goal>
162-
</goals>
163-
<configuration>
164-
<artifactItems>
165-
<artifactItem>
166-
<groupId>${project.groupId}</groupId>
167-
<artifactId>exporter-otlp.spec</artifactId>
168-
<fileMappers>
169-
<org.codehaus.plexus.components.io.filemappers.RegExpFileMapper>
170-
<pattern>^\Qio/aklivity/zilla/specs/exporter/otlp/\E</pattern>
171-
<replacement>io/aklivity/zilla/runtime/exporter/otlp/internal/</replacement>
172-
</org.codehaus.plexus.components.io.filemappers.RegExpFileMapper>
173-
</fileMappers>
174-
</artifactItem>
175-
</artifactItems>
176-
<includes>
177-
io/aklivity/zilla/specs/exporter/otlp/application/**/*,
178-
io/aklivity/zilla/specs/exporter/otlp/config/*
179-
</includes>
180-
<outputDirectory>${project.build.directory}/test-classes</outputDirectory>
181-
</configuration>
182-
</execution>
183157
</executions>
184158
</plugin>
185159
<plugin>

0 commit comments

Comments
 (0)