Skip to content
This repository has been archived by the owner on Oct 25, 2022. It is now read-only.

Feature/log level counter #22

Merged
merged 2 commits into from
Nov 17, 2015
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
Initial Log Level Counter
* test needs to be implemented
  • Loading branch information
larsp committed Nov 17, 2015
commit 1f8f16401163044545dc92fffd834e9d080e6e66
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//package com.swookiee.runtime.metrics.prometheus.logcounter;
//
//import static org.junit.Assert.assertEquals;
//
//import ch.qos.logback.classic.Level;
//import ch.qos.logback.classic.spi.ILoggingEvent;
//import io.prometheus.client.CollectorRegistry;
//import org.junit.Before;
//import org.junit.Test;
//
//public class LogLevelCounterTest {
// def LogLevelCounterAppender appender;
// def ILoggingEvent event;
// def CollectorRegistry collectorRegistry = [] as CollectorRegistry
//
// @Before
// public void setUp() throws Exception {
// appender = new LogLevelCounterAppender();
// appender.start();
// }
//
// @Test
// public void metersTraceEvents() throws Exception {
// event = [getLevel:{Level.TRACE}] as ILoggingEvent
// appender.doAppend(event);
// assertEquals(1, getLogLevelCount("trace"));
// }
//
// private int getLogLevelCount(String level) {
// return appender.counter.("counter", ["level"] as String[],[level] as String[]).intValue();
// }
//}
9 changes: 8 additions & 1 deletion com.swookiee.runtime.metrics.prometheus/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,14 @@ Bundle-ManifestVersion: 2
Bundle-Name: Swookiee Runtime prometheus Bundle
Bundle-SymbolicName: com.swookiee.runtime.metrics.prometheus
Bundle-Version: 1.0.0.qualifier
Import-Package: com.fasterxml.jackson.annotation,
Import-Package: ch.qos.logback.classic,
ch.qos.logback.classic.spi,
ch.qos.logback.core,
ch.qos.logback.core.encoder,
ch.qos.logback.core.rolling,
ch.qos.logback.core.spi,
ch.qos.logback.core.status,
com.fasterxml.jackson.annotation,
com.fasterxml.jackson.databind,
com.swookiee.runtime.util.configuration,
io.prometheus.client;version="0.0.9",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
* *****************************************************************************
* Copyright (c) 2015 Lars Pfannenschmidt and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Lars Pfannenschmidt - initial implementation
* *****************************************************************************
*/
package com.swookiee.runtime.metrics.prometheus.logcounter;

import io.prometheus.client.Collector;

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
public class LogLevelCounter {
private static final Logger logger = LoggerFactory.getLogger(LogLevelCounter.class);
private ServiceRegistration<Collector> registerdCounter;
private LogLevelCounterAppender instrumentedAppender;
private ch.qos.logback.classic.Logger rootLogger;

@Activate
public void activate(BundleContext bundleContext) {
logger.info("Starting Prometheus Log Level Counter!");
rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("root");
instrumentedAppender = new LogLevelCounterAppender();
instrumentedAppender.start();
rootLogger.addAppender(instrumentedAppender);
registerdCounter = bundleContext.registerService(Collector.class, instrumentedAppender.getCounter(), null);
}

@Deactivate
public void deactivate() {
instrumentedAppender.stop();
rootLogger.detachAppender(instrumentedAppender);
registerdCounter.unregister();
logger.info("Stopped Prometheus Log Level Counter!");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/**
* *****************************************************************************
* Copyright (c) 2015 Lars Pfannenschmidt and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Lars Pfannenschmidt - initial implementation
* *****************************************************************************
*/
package com.swookiee.runtime.metrics.prometheus.logcounter;

import io.prometheus.client.Counter;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;

public class LogLevelCounterAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {

public static final String COUNTER_NAME = "logback_loglevel_total";

private final Counter counter;
private final Counter.Child traceLabel;
private final Counter.Child debugLabel;
private final Counter.Child infoLabel;
private final Counter.Child warnLabel;
private final Counter.Child errorLabel;

public LogLevelCounterAppender() {
counter = Counter.build()
.name(COUNTER_NAME)
.help("Logback log statements at various log levels")
.labelNames("level")
.register();
traceLabel = counter.labels("trace");
debugLabel = counter.labels("debug");
infoLabel = counter.labels("info");
warnLabel = counter.labels("warn");
errorLabel = counter.labels("error");
}

@Override
protected void append(ILoggingEvent event) {
switch (event.getLevel().toInt()) {
case Level.TRACE_INT:
traceLabel.inc();
break;
case Level.DEBUG_INT:
debugLabel.inc();
break;
case Level.INFO_INT:
infoLabel.inc();
break;
case Level.WARN_INT:
warnLabel.inc();
break;
case Level.ERROR_INT:
errorLabel.inc();
break;
default:
break;
}
}

public Counter getCounter() {
return counter;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,29 @@
*/
package com.swookiee.runtime.metrics.prometheus.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.swookiee.runtime.metrics.prometheus.CollectorRegistryInventory;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.exporter.common.TextFormat;
import org.osgi.service.component.annotations.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.Set;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.swookiee.runtime.metrics.prometheus.CollectorRegistryInventory;

@Component
public class MetricsService implements Metrics {

Expand All @@ -48,11 +55,11 @@ public void deactivate() {
}

@Reference(cardinality = ReferenceCardinality.MANDATORY)
public void setMetricRegistry(final CollectorRegistryInventory inventory) {
public void setMetricRegistry(CollectorRegistryInventory inventory) {
this.inventory = inventory;
}

public void unsetMetricRegistry(final CollectorRegistryInventory inventory) {
public void unsetMetricRegistry(CollectorRegistryInventory inventory) {
this.inventory = null;
}

Expand Down Expand Up @@ -85,16 +92,14 @@ public Response plainBundleList() {

@Override
public Response htmlBundleList(UriInfo uri) {
String linkTemplate = "<a href="
+ uri.getAbsolutePath().toString();
String linkTemplate = "<a href=" + uri.getAbsolutePath().toString();

if (uri.getAbsolutePath().toString().endsWith("/")){
if (uri.getAbsolutePath().toString().endsWith("/")) {
linkTemplate += "%s>%s</a><br />";
} else {
linkTemplate += "/%s>%s</a><br />";
}


StringBuilder builder = new StringBuilder();
builder.append("<html><head></head><body>");
for (String bundle : inventory.getRegisteredBundles()) {
Expand Down