• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2015 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5from infra_libs.ts_mon.common import distribution
6from infra_libs.ts_mon.common import metrics
7
8
9# Extending HTTP status codes to client-side errors and timeouts.
10STATUS_OK = 200
11STATUS_ERROR = 901
12STATUS_TIMEOUT = 902
13STATUS_EXCEPTION = 909
14
15
16# 90% of durations are in the range 11-1873ms.  Growth factor 10^0.06 puts that
17# range into 37 buckets.  Max finite bucket value is 12 minutes.
18_duration_bucketer = distribution.GeometricBucketer(10**0.06)
19
20# 90% of sizes are in the range 0.17-217014 bytes.  Growth factor 10^0.1 puts
21# that range into 54 buckets.  Max finite bucket value is 6.3GB.
22_size_bucketer = distribution.GeometricBucketer(10**0.1)
23
24
25request_bytes = metrics.CumulativeDistributionMetric('http/request_bytes',
26    'Bytes sent per http request (body only).', [
27        metrics.StringField('name'),
28        metrics.StringField('client'),
29    ],
30    bucketer=_size_bucketer)
31response_bytes = metrics.CumulativeDistributionMetric('http/response_bytes',
32    'Bytes received per http request (content only).', [
33        metrics.StringField('name'),
34        metrics.StringField('client'),
35    ],
36    bucketer=_size_bucketer)
37durations = metrics.CumulativeDistributionMetric('http/durations',
38    'Time elapsed between sending a request and getting a'
39    ' response (including parsing) in milliseconds.', [
40        metrics.StringField('name'),
41        metrics.StringField('client'),
42    ],
43    bucketer=_duration_bucketer)
44response_status = metrics.CounterMetric('http/response_status',
45    'Number of responses received by HTTP status code.', [
46        metrics.IntegerField('status'),
47        metrics.StringField('name'),
48        metrics.StringField('client'),
49    ])
50
51
52server_request_bytes = metrics.CumulativeDistributionMetric(
53    'http/server_request_bytes',
54    'Bytes received per http request (body only).', [
55        metrics.IntegerField('status'),
56        metrics.StringField('name'),
57        metrics.BooleanField('is_robot'),
58    ],
59    bucketer=_size_bucketer)
60server_response_bytes = metrics.CumulativeDistributionMetric(
61    'http/server_response_bytes',
62    'Bytes sent per http request (content only).', [
63        metrics.IntegerField('status'),
64        metrics.StringField('name'),
65        metrics.BooleanField('is_robot'),
66    ],
67    bucketer=_size_bucketer)
68server_durations = metrics.CumulativeDistributionMetric('http/server_durations',
69    'Time elapsed between receiving a request and sending a'
70    ' response (including parsing) in milliseconds.', [
71        metrics.IntegerField('status'),
72        metrics.StringField('name'),
73        metrics.BooleanField('is_robot'),
74    ],
75    bucketer=_duration_bucketer)
76server_response_status = metrics.CounterMetric('http/server_response_status',
77    'Number of responses sent by HTTP status code.', [
78        metrics.IntegerField('status'),
79        metrics.StringField('name'),
80        metrics.BooleanField('is_robot'),
81    ])
82
83
84def update_http_server_metrics(endpoint_name, response_status_code, elapsed_ms,
85                               request_size=None, response_size=None,
86                               user_agent=None):
87  fields = {'status': response_status_code, 'name': endpoint_name,
88            'is_robot': False}
89  if user_agent is not None:
90    # We must not log user agents, but we can store whether or not the
91    # user agent string indicates that the requester was a Google bot.
92    fields['is_robot'] = (
93        'GoogleBot' in user_agent or
94        'GoogleSecurityScanner' in user_agent or
95        user_agent == 'B3M/prober')
96
97  server_durations.add(elapsed_ms, fields=fields)
98  server_response_status.increment(fields=fields)
99  if request_size is not None:
100    server_request_bytes.add(request_size, fields=fields)
101  if response_size is not None:
102    server_response_bytes.add(response_size, fields=fields)
103