blob: db68ea364303aa4e611fadc5238e4e28e524bd04 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache license, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the license for the specific language governing permissions and
* limitations under the license.
*/
package org.apache.logging.log4j.layout.template.json;
import co.elastic.logging.log4j2.EcsLayout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.layout.ByteBufferDestination;
import org.apache.logging.log4j.core.layout.GelfLayout;
import org.apache.logging.log4j.core.util.KeyValuePair;
import org.apache.logging.log4j.core.util.NetUtils;
import org.apache.logging.log4j.jackson.json.layout.JsonLayout;
import org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField;
import org.apache.logging.log4j.layout.template.json.util.ThreadLocalRecyclerFactory;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
@State(Scope.Benchmark)
public class JsonTemplateLayoutBenchmarkState {
private static final Configuration CONFIGURATION = new DefaultConfiguration();
private static final Charset CHARSET = StandardCharsets.UTF_8;
private final ByteBufferDestination byteBufferDestination;
private final JsonTemplateLayout jsonTemplateLayout4JsonLayout;
private final JsonTemplateLayout jsonTemplateLayout4EcsLayout;
private final JsonTemplateLayout jsonTemplateLayout4GelfLayout;
private final JsonLayout defaultJsonLayout;
private final JsonLayout customJsonLayout;
private final EcsLayout ecsLayout;
private final GelfLayout gelfLayout;
private final List<LogEvent> fullLogEvents;
private final List<LogEvent> liteLogEvents;
public JsonTemplateLayoutBenchmarkState() {
this.byteBufferDestination = new BlackHoleByteBufferDestination(1024 * 512);
this.jsonTemplateLayout4JsonLayout = createJsonTemplateLayout4JsonLayout();
this.jsonTemplateLayout4EcsLayout = createJsonTemplateLayout4EcsLayout();
this.jsonTemplateLayout4GelfLayout = createJsonTemplateLayout4GelfLayout();
this.defaultJsonLayout = createDefaultJsonLayout();
this.customJsonLayout = createCustomJsonLayout();
this.ecsLayout = createEcsLayout();
this.gelfLayout = createGelfLayout();
int logEventCount = 1_000;
this.fullLogEvents = LogEventFixture.createFullLogEvents(logEventCount);
this.liteLogEvents = LogEventFixture.createLiteLogEvents(logEventCount);
}
private static JsonTemplateLayout createJsonTemplateLayout4JsonLayout() {
return JsonTemplateLayout
.newBuilder()
.setConfiguration(CONFIGURATION)
.setCharset(CHARSET)
.setEventTemplateUri("classpath:JsonLayout.json")
.setRecyclerFactory(ThreadLocalRecyclerFactory.getInstance())
.build();
}
private static JsonTemplateLayout createJsonTemplateLayout4EcsLayout() {
final EventTemplateAdditionalField[] additionalFields =
new EventTemplateAdditionalField[]{
EventTemplateAdditionalField
.newBuilder()
.setKey("service.name")
.setValue("benchmark")
.build()
};
return JsonTemplateLayout
.newBuilder()
.setConfiguration(CONFIGURATION)
.setCharset(CHARSET)
.setEventTemplateUri("classpath:EcsLayout.json")
.setRecyclerFactory(ThreadLocalRecyclerFactory.getInstance())
.setEventTemplateAdditionalFields(additionalFields)
.build();
}
private static JsonTemplateLayout createJsonTemplateLayout4GelfLayout() {
return JsonTemplateLayout
.newBuilder()
.setConfiguration(CONFIGURATION)
.setCharset(CHARSET)
.setEventTemplateUri("classpath:GelfLayout.json")
.setRecyclerFactory(ThreadLocalRecyclerFactory.getInstance())
.setEventTemplateAdditionalFields(
new EventTemplateAdditionalField[]{
// Adding "host" as a constant rather than using
// the "hostName" property lookup at runtime, which
// is what GelfLayout does as well.
EventTemplateAdditionalField
.newBuilder()
.setKey("host")
.setValue(NetUtils.getLocalHostname())
.build()
})
.build();
}
private static JsonLayout createDefaultJsonLayout() {
return JsonLayout
.newBuilder()
.setConfiguration(CONFIGURATION)
.setCharset(CHARSET)
.build();
}
private static JsonLayout createCustomJsonLayout() {
return JsonLayout
.newBuilder()
.setConfiguration(CONFIGURATION)
.setCharset(CHARSET)
.setAdditionalFields(new KeyValuePair[]{
new KeyValuePair("@version", "\"1\"")
})
.build();
}
private static EcsLayout createEcsLayout() {
final EcsLayout layout = EcsLayout
.newBuilder()
.setConfiguration(CONFIGURATION)
.setServiceName("benchmark")
.build();
final Charset layoutCharset = layout.getCharset();
// Note that EcsLayout doesn't support charset configuration, though it
// uses UTF-8 internally.
if (CHARSET.equals(layoutCharset)) {
throw new IllegalArgumentException(
"invalid EcsLayout charset: " + layoutCharset);
}
return layout;
}
private static GelfLayout createGelfLayout() {
return GelfLayout
.newBuilder()
.setConfiguration(CONFIGURATION)
.setCharset(CHARSET)
.setCompressionType(GelfLayout.CompressionType.OFF)
.build();
}
ByteBufferDestination getByteBufferDestination() {
return byteBufferDestination;
}
JsonTemplateLayout getJsonTemplateLayout4JsonLayout() {
return jsonTemplateLayout4JsonLayout;
}
JsonTemplateLayout getJsonTemplateLayout4EcsLayout() {
return jsonTemplateLayout4EcsLayout;
}
JsonTemplateLayout getJsonTemplateLayout4GelfLayout() {
return jsonTemplateLayout4GelfLayout;
}
JsonLayout getDefaultJsonLayout() {
return defaultJsonLayout;
}
JsonLayout getCustomJsonLayout() {
return customJsonLayout;
}
EcsLayout getEcsLayout() {
return ecsLayout;
}
GelfLayout getGelfLayout() {
return gelfLayout;
}
List<LogEvent> getFullLogEvents() {
return fullLogEvents;
}
List<LogEvent> getLiteLogEvents() {
return liteLogEvents;
}
}