Add ProviderContext.

Adds a ProviderContext type which is passed to LabelProvider#getLabels
and StructuredParameterProvider#getParameter and which carries some
information from ExtLogRecord that is not taken care of by Formatter.

ProviderContext is designed to be extended in the future.

Change-Id: Ib29b7032ae42e0f9e86c75b7404c25cd75b20011
diff --git a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
index f6167f6..c4e36de 100644
--- a/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
+++ b/core/src/main/java/eu/mulk/quarkus/googlecloud/jsonlogging/Formatter.java
@@ -99,15 +99,17 @@
     List<StructuredParameter> parameters = new ArrayList<>();
     Map<String, String> labels = new HashMap<>();
 
+    var providerContext = new ProviderContext(logRecord);
+
     for (var parameterProvider : parameterProviders) {
-      var parameter = parameterProvider.getParameter();
+      var parameter = parameterProvider.getParameter(providerContext);
       if (parameter != null) {
         parameters.add(parameter);
       }
     }
 
     for (var labelProvider : labelProviders) {
-      var providedLabels = labelProvider.getLabels();
+      var providedLabels = labelProvider.getLabels(providerContext);
       if (providedLabels != null) {
         for (var label : providedLabels) {
           labels.put(label.key(), label.value());
@@ -185,4 +187,37 @@
       return ERROR_LEVEL;
     }
   }
+
+  /**
+   * An implementation of {@link LabelProvider.Context} and {@link
+   * StructuredParameterProvider.Context}.
+   */
+  private static class ProviderContext
+      implements LabelProvider.Context, StructuredParameterProvider.Context {
+
+    private final String loggerName;
+    private final long sequenceNumber;
+    private final String threadName;
+
+    private ProviderContext(ExtLogRecord logRecord) {
+      loggerName = logRecord.getLoggerName();
+      sequenceNumber = logRecord.getSequenceNumber();
+      threadName = logRecord.getThreadName();
+    }
+
+    @Override
+    public String loggerName() {
+      return loggerName;
+    }
+
+    @Override
+    public long sequenceNumber() {
+      return sequenceNumber;
+    }
+
+    @Override
+    public String threadName() {
+      return threadName;
+    }
+  }
 }