Skip to content

Commit

Permalink
Add Armeria version metric (#2179)
Browse files Browse the repository at this point in the history
Motivation:

- Want to check Armeria version with Grafana
  FYI:
  In Prometheus best practices, this kind of metric is described as follows.
  https://prometheus.io/docs/practices/naming/
  > foobar_build_info (for a pseudo-metric that provides metadata about the running binary)
  
  e.g.
  ```
  # HELP node_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, and goversion from which node_exporter was built.
  # TYPE node_exporter_build_info gauge
  node_exporter_build_info{branch="master",goversion="go1.7.5",revision="840ba5dcc71a084a3bc63cb6063003c1f94435a6",version="0.14.0"} 1
  ```

Modifications:

- Add Armeria version metric

Result:

It's exported as follows:

Labels:
- `commit`
- `version`
- `repoStatus`

```
# HELP armeria_build_info A metric with a constant '1' value labeled by version and commit hash from which Armeria was built.
# TYPE armeria_build_info gauge
armeria_build_info{commit="74700d402178e00045b1ca23006f7f6131b2a92d",version="0.94.1-SNAPSHOT",repoStatus="clean"} 1.0
```
  • Loading branch information
matsumana authored and trustin committed Oct 18, 2019
1 parent 59d98c3 commit 29e55e7
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
27 changes: 27 additions & 0 deletions core/src/main/java/com/linecorp/armeria/server/Server.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
import com.google.common.collect.Iterables;
Expand All @@ -58,13 +59,16 @@
import com.linecorp.armeria.common.metric.MeterIdPrefix;
import com.linecorp.armeria.common.util.EventLoopGroups;
import com.linecorp.armeria.common.util.StartStopSupport;
import com.linecorp.armeria.common.util.Version;
import com.linecorp.armeria.internal.ChannelUtil;
import com.linecorp.armeria.internal.ConnectionLimitingHandler;
import com.linecorp.armeria.internal.PathAndQuery;
import com.linecorp.armeria.internal.TransportType;
import com.linecorp.armeria.server.logging.AccessLogWriter;

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
Expand Down Expand Up @@ -118,6 +122,8 @@ public static ServerBuilder builder() {
final MeterIdPrefix idPrefix = new MeterIdPrefix("armeria.server.parsedPathCache");
PathAndQuery.registerMetrics(config.meterRegistry(), idPrefix);

setupVersionMetrics();

// Invoke the serviceAdded() method in Service so that it can keep the reference to this Server or
// add a listener to it.
config.serviceConfigs().forEach(cfg -> ServiceCallbackInvoker.invokeServiceAdded(cfg, cfg.service()));
Expand Down Expand Up @@ -305,6 +311,27 @@ public int numConnections() {
return connectionLimitingHandler.numConnections();
}

/**
* Sets up the version metrics.
*/
@VisibleForTesting
void setupVersionMetrics() {
final MeterRegistry meterRegistry = config().meterRegistry();
final Map<String, Version> map = Version.identify(getClass().getClassLoader());
final Version versionInfo = map.get("armeria");
final String version = versionInfo.artifactVersion();
final String commit = versionInfo.longCommitHash();
final String repositoryStatus = versionInfo.repositoryStatus();
final List<Tag> tags = ImmutableList.of(Tag.of("version", version),
Tag.of("commit", commit),
Tag.of("repoStatus", repositoryStatus));
Gauge.builder("armeria.build.info", () -> 1)
.tags(tags)
.description("A metric with a constant '1' value labeled by version and commit hash" +
" from which Armeria was built.")
.register(meterRegistry);
}

@Override
public String toString() {
return MoreObjects.toStringHelper(this)
Expand Down
14 changes: 14 additions & 0 deletions core/src/test/java/com/linecorp/armeria/server/ServerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import com.linecorp.armeria.testing.internal.AnticipatedException;
import com.linecorp.armeria.testing.junit4.server.ServerRule;

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.netty.channel.ChannelOption;
import io.netty.handler.codec.http.HttpStatusClass;
Expand Down Expand Up @@ -436,6 +437,19 @@ public void notGracefulShutdownBlockingTaskExecutor() {
assertThat(MoreExecutors.shutdownAndAwaitTermination(executor, 10, TimeUnit.SECONDS)).isTrue();
}

@Test
public void versionMetrics() {
final Server server = ServerTest.server.server();
server.setupVersionMetrics();

final MeterRegistry meterRegistry = server.config().meterRegistry();
final Gauge gauge = meterRegistry.find("armeria.build.info")
.tagKeys("version", "commit", "repoStatus")
.gauge();
assertThat(gauge).isNotNull();
assertThat(gauge.value()).isOne();
}

private static void testSimple(
String reqLine, String expectedStatusLine, String... expectedHeaders) throws Exception {

Expand Down

0 comments on commit 29e55e7

Please sign in to comment.