Skip to content
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 an InstrumentedAppender constructor that allows passing a CollectorRegistry #690

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,46 @@
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.Counter;

public class InstrumentedAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {

public static final String COUNTER_NAME = "logback_appender_total";

private static final Counter COUNTER;
private static final Counter.Child TRACE_LABEL;
private static final Counter.Child DEBUG_LABEL;
private static final Counter.Child INFO_LABEL;
private static final Counter.Child WARN_LABEL;
private static final Counter.Child ERROR_LABEL;

static {
COUNTER = Counter.build().name(COUNTER_NAME)
.help("Logback log statements at various log levels")
.labelNames("level")
.register();

TRACE_LABEL = COUNTER.labels("trace");
DEBUG_LABEL = COUNTER.labels("debug");
INFO_LABEL = COUNTER.labels("info");
WARN_LABEL = COUNTER.labels("warn");
ERROR_LABEL = COUNTER.labels("error");
}
private static final Counter defaultCounter = Counter.build().name(COUNTER_NAME)
.help("Logback log statements at various log levels")
.labelNames("level")
.register();
private final Counter.Child traceCounter;
private final Counter.Child debugCounter;
private final Counter.Child infoCounter;
private final Counter.Child warnCounter;
private final Counter.Child errorCounter;

/**
* Create a new instrumented appender using the default registry.
*/
public InstrumentedAppender() {
this(defaultCounter);
}

/**
* Create a new instrumented appender using the supplied registry.
*/
public InstrumentedAppender(CollectorRegistry registry) {
this(Counter.build().name(COUNTER_NAME)
.help("Logback log statements at various log levels")
.labelNames("level")
.register(registry));
}

private InstrumentedAppender(Counter counter) {
this.traceCounter = counter.labels("trace");
this.debugCounter = counter.labels("debug");
this.infoCounter = counter.labels("info");
this.warnCounter = counter.labels("warn");
this.errorCounter = counter.labels("error");
}

@Override
public void start() {
Expand All @@ -45,19 +53,19 @@ public void start() {
protected void append(ILoggingEvent event) {
switch (event.getLevel().toInt()) {
case Level.TRACE_INT:
TRACE_LABEL.inc();
this.traceCounter.inc();
break;
case Level.DEBUG_INT:
DEBUG_LABEL.inc();
this.debugCounter.inc();
break;
case Level.INFO_INT:
INFO_LABEL.inc();
this.infoCounter.inc();
break;
case Level.WARN_INT:
WARN_LABEL.inc();
this.warnCounter.inc();
break;
case Level.ERROR_INT:
ERROR_LABEL.inc();
this.errorCounter.inc();
break;
default:
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,21 @@
import org.junit.Test;

public class InstrumentedAppenderTest {

private CollectorRegistry registry;
private InstrumentedAppender appender;
private InstrumentedAppender defaultAppender;
private ILoggingEvent event;

@Before
public void setUp() throws Exception {
appender = new InstrumentedAppender();
registry = new CollectorRegistry();

appender = new InstrumentedAppender(registry);
appender.start();


defaultAppender = new InstrumentedAppender();
defaultAppender.start();

event = mock(ILoggingEvent.class);
}

Expand All @@ -29,48 +35,63 @@ public void metersTraceEvents() throws Exception {
when(event.getLevel()).thenReturn(Level.TRACE);

appender.doAppend(event);

assertEquals(1, getLogLevelCount("trace"));

defaultAppender.doAppend(event);
assertEquals(1, getDefaultLogLevelCount("trace"));
}

@Test
public void metersDebugEvents() throws Exception {
when(event.getLevel()).thenReturn(Level.DEBUG);

appender.doAppend(event);

assertEquals(1, getLogLevelCount("debug"));

defaultAppender.doAppend(event);
assertEquals(1, getDefaultLogLevelCount("debug"));
}

@Test
public void metersInfoEvents() throws Exception {
when(event.getLevel()).thenReturn(Level.INFO);

appender.doAppend(event);

assertEquals(1, getLogLevelCount("info"));

defaultAppender.doAppend(event);
assertEquals(1, getDefaultLogLevelCount("info"));
}

@Test
public void metersWarnEvents() throws Exception {
when(event.getLevel()).thenReturn(Level.WARN);

appender.doAppend(event);

assertEquals(1, getLogLevelCount("warn"));

defaultAppender.doAppend(event);
assertEquals(1, getDefaultLogLevelCount("warn"));
}

@Test
public void metersErrorEvents() throws Exception {
when(event.getLevel()).thenReturn(Level.ERROR);

appender.doAppend(event);

assertEquals(1, getLogLevelCount("error"));

defaultAppender.doAppend(event);
assertEquals(1, getDefaultLogLevelCount("error"));
}

private int getLogLevelCount(String level) {
return CollectorRegistry.defaultRegistry.getSampleValue(COUNTER_NAME,
new String[]{"level"}, new String[]{level}).intValue();
return registry.getSampleValue(COUNTER_NAME, new String[]{"level"}, new String[]{level}).intValue();
}

private int getDefaultLogLevelCount(String level) {
return CollectorRegistry.defaultRegistry
.getSampleValue(COUNTER_NAME, new String[]{"level"}, new String[]{level})
.intValue();
}
}