package io.prometheus.client.log4j;

import io.prometheus.client.Counter;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;

public class InstrumentedAppender extends AppenderSkeleton {

  public static final String COUNTER_NAME = "log4j_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;
  private static final Counter.Child FATAL_LABEL;

  static {
    COUNTER =
        Counter.build()
            .name(COUNTER_NAME)
            .help("Log4j 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");
    FATAL_LABEL = COUNTER.labels("fatal");
  }

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

  @Override
  public void activateOptions() {}

  @Override
  protected void append(LoggingEvent event) {
    switch (event.getLevel().toInt()) {
      case Level.TRACE_INT:
        TRACE_LABEL.inc();
        break;
      case Level.DEBUG_INT:
        DEBUG_LABEL.inc();
        break;
      case Level.INFO_INT:
        INFO_LABEL.inc();
        break;
      case Level.WARN_INT:
        WARN_LABEL.inc();
        break;
      case Level.ERROR_INT:
        ERROR_LABEL.inc();
        break;
      case Level.FATAL_INT:
        FATAL_LABEL.inc();
        break;
      default:
        break;
    }
  }

  @Override
  public void close() {
    // nothing doing
  }

  @Override
  public boolean requiresLayout() {
    return false;
  }
}
