Files
gerrit/javatests/com/google/gerrit/metrics
Edwin Kempin 103c5d14fe Have a dedicated class for metadata that is provided to TraceTimer and PerformanceLogger
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>
2019-07-12 13:40:06 +02:00
..
2019-05-06 11:12:41 -07:00