gitlab-org--gitlab-foss/doc/development/service_measurement.md

2.7 KiB

stage group info
none unassigned To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers

GitLab Developers Guide to service measurement

You can enable service measurement in order to debug any slow service's execution time, number of SQL calls, garbage collection stats, memory usage, etc.

Measuring module

The measuring module is a tool that allows to measure a service's execution, and log:

  • Service class name
  • Execution time
  • Number of SQL calls
  • Detailed gc stats and diffs
  • RSS memory usage
  • Server worker ID

The measuring module will log these measurements into a structured log called service_measurement.log, as a single entry for each service execution.

For GitLab.com, service_measurement.log is ingested in Elasticsearch and Kibana as part of our monitoring solution.

How to use it

The measuring module allows you to easily measure and log execution of any service, by just prepending Measurable in any Service class, on the last line of the file that the class resides in.

For example, to prepend a module into the DummyService class, you would use the following approach:

class DummyService
  def execute
  # ...
  end
end

DummyService.prepend(Measurable)

In case when you are prepending a module from the EE namespace with EE features, you need to prepend Measurable after prepending the EE module.

This way, Measurable will be at the bottom of the ancestor chain, in order to measure execution of EE features as well:

class DummyService
  def execute
  # ...
  end
end

DummyService.prepend_if_ee('EE::DummyService')
DummyService.prepend(Measurable)

Log additional attributes

In case you need to log some additional attributes, it is possible to define extra_attributes_for_measurement in the service class:

def extra_attributes_for_measurement
  {
    project_path: @project.full_path,
    user: current_user.name
  }
end

After the measurement module is injected in the service, it will be behind a generic feature flag. To actually use it, you need to enable measuring for the desired service by enabling the feature flag.

Enabling measurement using feature flags

In the following example, the :gitlab_service_measuring_projects_import_service feature flag is used to enable the measuring feature for Projects::ImportService.

From ChatOps:

/chatops run feature set gitlab_service_measuring_projects_import_service true