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>
50 files changed
tree: 91736741f8d53be85fcfd4cb537aaed4e70f8ea3
  1. .settings/
  2. antlr3/
  3. contrib/
  4. Documentation/
  5. java/
  6. javatests/
  7. lib/
  8. plugins/
  9. polygerrit-ui/
  10. prolog/
  11. prologtests/
  12. proto/
  13. resources/
  14. tools/
  15. webapp/
  16. .bazelproject
  17. .bazelrc
  18. .bazelversion
  19. .editorconfig
  20. .git-blame-ignore-revs
  21. .gitignore
  22. .gitmodules
  23. .mailmap
  24. .pydevproject
  25. BUILD
  26. COPYING
  27. INSTALL
  28. package.json
  29. README.md
  30. SUBMITTING_PATCHES
  31. version.bzl
  32. WORKSPACE
README.md

Gerrit Code Review

Gerrit is a code review and project management tool for Git based projects.

Build Status

Objective

Gerrit makes reviews easier by showing changes in a side-by-side display, and allowing inline comments to be added by any reviewer.

Gerrit simplifies Git based project maintainership by permitting any authorized user to submit changes to the master Git repository, rather than requiring all approved changes to be merged in by hand by the project maintainer.

Documentation

For information about how to install and use Gerrit, refer to the documentation.

Source

Our canonical Git repository is located on googlesource.com. There is a mirror of the repository on Github.

Reporting bugs

Please report bugs on the issue tracker.

Contribute

Gerrit is the work of hundreds of contributors. We appreciate your help!

Please read the contribution guidelines.

Note that we do not accept Pull Requests via the Github mirror.

Getting in contact

The Developer Mailing list is repo-discuss on Google Groups.

License

Gerrit is provided under the Apache License 2.0.

Build

Install Bazel and run the following:

    git clone --recurse-submodules https://gerrit.googlesource.com/gerrit
    cd gerrit && bazel build release

Install binary packages (Deb/Rpm)

The instruction how to configure GerritForge/BinTray repositories is here

On Debian/Ubuntu run:

    apt-get update & apt-get install gerrit=<version>-<release>

NOTE: release is a counter that starts with 1 and indicates the number of packages that have been released with the same version of the software.

On CentOS/RedHat run:

    yum clean all && yum install gerrit-<version>[-<release>]

On Fedora run:

    dnf clean all && dnf install gerrit-<version>[-<release>]

Use pre-built Gerrit images on Docker

Docker images of Gerrit are available on DockerHub

To run a CentOS 7 based Gerrit image:

    docker run -p 8080:8080 gerritforge/gerrit-centos7[:version]

To run a Ubuntu 15.04 based Gerrit image:

    docker run -p 8080:8080 gerritforge/gerrit-ubuntu15.04[:version]

NOTE: release is optional. Last released package of the version is installed if the release number is omitted.