 103c5d14fe
			
		
	
	103c5d14fe
	
	
	
		
			
			Currently all metadata are key-value pairs, where both keys and values are strings. This leads to an API that is difficult to use: * change I776138eaa had to fix callers which forgot to specify metadata keys * change I758660f8b had to make metadata keys consistent * there are many similar methods with different numbers of key-value pairs for metadata This change introduces a dedicated Metadata class that is used in the API instead of key-value pairs that are strings. The Metadata class contains dedicated fields for all known metadata types. Using the Metadata.Builder it's now easy to provide metadata consistenly in all places (there are dedicated methods to set pieces of metadata, so that there is no longer a need to provide string keys for them). For plugins that want to provide metadata for which Gerrit core doesn't provide a suitable metadata field, Metadata contains a pluginMetadata field in which arbitrary key-value pairs can be stored. That should only be used for plugins. If Gerrit core needs additional metadata fields the Metadata class should be extended. The fields in Metadata only use basic Java types because the logging package, that contains the Metadata class, should not have any dependency on the large Gerrit packages that define the Gerrit types (e.g. Project.NameKey). For PerformanceLoggers it is important to know about the semantics of the provided metadata, as some of the metadata may be considered sensitive and must not end up in a performance log. Having the Metadata class allows PerformanceLogger implementations to decide which metadata they want to log and which metadata they want to omit. A speciality is the recording of performance log entries from metric timers. Whenever a metric timer is used we automatically report the measured time as a performance log record. As metadata we provide the value of the metric fields which are used for bucketing. As metadata keys we used the field names. To properly populate the metadata in the new Metadata type now, the definition of the metric fields must do the mapping of the field value to a field in the Metadata class. For this a MetadataMapper must be provided when the field is created. Change-Id: Idedf6368365cd7b54a78c86457d26933746477e8 Signed-off-by: Edwin Kempin <ekempin@google.com>
		
			
				
	
	
		
			40 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| // Copyright (C) 2019 The Android Open Source Project
 | |
| //
 | |
| // Licensed 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 com.google.gerrit.server.logging;
 | |
| 
 | |
| import com.google.auto.value.AutoValue;
 | |
| import com.google.gerrit.common.Nullable;
 | |
| import java.util.Optional;
 | |
| 
 | |
| /**
 | |
|  * Key-value pair for custom metadata that is provided by plugins.
 | |
|  *
 | |
|  * <p>PluginMetadata allows plugins to include custom metadata into the {@link Metadata} instances
 | |
|  * that are provided as context for performance tracing.
 | |
|  *
 | |
|  * <p>Plugins should use PluginMetadata only for metadata kinds that are not known to Gerrit core
 | |
|  * (metadata for which {@link Metadata} doesn't have a dedicated field).
 | |
|  */
 | |
| @AutoValue
 | |
| public abstract class PluginMetadata {
 | |
|   public static PluginMetadata create(String key, @Nullable String value) {
 | |
|     return new AutoValue_PluginMetadata(key, Optional.ofNullable(value));
 | |
|   }
 | |
| 
 | |
|   public abstract String key();
 | |
| 
 | |
|   public abstract Optional<String> value();
 | |
| }
 |