Martin Blanchard pushed to branch mablanch/135-monitoring-bus at BuildGrid / buildgrid
Commits:
- 
e2244954
by Martin Blanchard at 2018-11-14T12:13:10Z
- 
467f13ce
by Martin Blanchard at 2018-11-14T12:13:15Z
- 
47fa6438
by Martin Blanchard at 2018-11-14T12:13:15Z
- 
e487a7b7
by Martin Blanchard at 2018-11-14T12:13:15Z
- 
a3deea8c
by Martin Blanchard at 2018-11-14T12:13:15Z
9 changed files:
- buildgrid/_app/commands/cmd_server.py
- buildgrid/_enums.py
- + buildgrid/_protos/buildgrid/__init__.py
- + buildgrid/_protos/buildgrid/v2/__init__.py
- + buildgrid/_protos/buildgrid/v2/monitoring.proto
- + buildgrid/_protos/buildgrid/v2/monitoring_pb2.py
- + buildgrid/_protos/buildgrid/v2/monitoring_pb2_grpc.py
- + buildgrid/server/_monitoring.py
- buildgrid/server/instance.py
Changes:
| ... | ... | @@ -20,7 +20,6 @@ Server command | 
| 20 | 20 |  Create a BuildGrid server.
 | 
| 21 | 21 |  """
 | 
| 22 | 22 |  | 
| 23 | -import asyncio
 | |
| 24 | 23 |  import logging
 | 
| 25 | 24 |  import sys
 | 
| 26 | 25 |  | 
| ... | ... | @@ -52,18 +51,14 @@ def start(context, config): | 
| 52 | 51 |          click.echo("ERROR: Could not parse config: {}.\n".format(str(e)), err=True)
 | 
| 53 | 52 |          sys.exit(-1)
 | 
| 54 | 53 |  | 
| 55 | -    loop = asyncio.get_event_loop()
 | |
| 56 | 54 |      try:
 | 
| 57 | 55 |          server.start()
 | 
| 58 | -        loop.run_forever()
 | |
| 59 | 56 |  | 
| 60 | 57 |      except KeyboardInterrupt:
 | 
| 61 | 58 |          pass
 | 
| 62 | 59 |  | 
| 63 | 60 |      finally:
 | 
| 64 | -        context.logger.info("Stopping server")
 | |
| 65 | 61 |          server.stop()
 | 
| 66 | -        loop.close()
 | |
| 67 | 62 |  | 
| 68 | 63 |  | 
| 69 | 64 |  def _create_server_from_config(config):
 | 
| ... | ... | @@ -16,9 +16,13 @@ | 
| 16 | 16 |  from enum import Enum
 | 
| 17 | 17 |  | 
| 18 | 18 |  from buildgrid._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
 | 
| 19 | +from buildgrid._protos.buildgrid.v2 import monitoring_pb2
 | |
| 19 | 20 |  from buildgrid._protos.google.devtools.remoteworkers.v1test2 import bots_pb2
 | 
| 20 | 21 |  | 
| 21 | 22 |  | 
| 23 | +# RWAPI enumerations
 | |
| 24 | +# From google/devtools/remoteworkers/v1test2/bots.proto:
 | |
| 25 | + | |
| 22 | 26 |  class BotStatus(Enum):
 | 
| 23 | 27 |      # Initially unknown state.
 | 
| 24 | 28 |      BOT_STATUS_UNSPECIFIED = bots_pb2.BotStatus.Value('BOT_STATUS_UNSPECIFIED')
 | 
| ... | ... | @@ -45,6 +49,9 @@ class LeaseState(Enum): | 
| 45 | 49 |      CANCELLED = bots_pb2.LeaseState.Value('CANCELLED')
 | 
| 46 | 50 |  | 
| 47 | 51 |  | 
| 52 | +# REAPI enumerations
 | |
| 53 | +# From build/bazel/remote/execution/v2/remote_execution.proto:
 | |
| 54 | + | |
| 48 | 55 |  class OperationStage(Enum):
 | 
| 49 | 56 |      # Initially unknown stage.
 | 
| 50 | 57 |      UNKNOWN = remote_execution_pb2.ExecuteOperationMetadata.Stage.Value('UNKNOWN')
 | 
| ... | ... | @@ -56,3 +63,41 @@ class OperationStage(Enum): | 
| 56 | 63 |      EXECUTING = remote_execution_pb2.ExecuteOperationMetadata.Stage.Value('EXECUTING')
 | 
| 57 | 64 |      # Finished execution.
 | 
| 58 | 65 |      COMPLETED = remote_execution_pb2.ExecuteOperationMetadata.Stage.Value('COMPLETED')
 | 
| 66 | + | |
| 67 | + | |
| 68 | +# Internal enumerations
 | |
| 69 | +# From buildgrid.v2/monitoring.proto:
 | |
| 70 | + | |
| 71 | +class LogRecordLevel(Enum):
 | |
| 72 | +    # Initially unknown level.
 | |
| 73 | +    NOTSET = monitoring_pb2.LogRecord.Level.Value('NOTSET')
 | |
| 74 | +    # Debug message severity level.
 | |
| 75 | +    DEBUG = monitoring_pb2.LogRecord.Level.Value('DEBUG')
 | |
| 76 | +    # Information message severity level.
 | |
| 77 | +    INFO = monitoring_pb2.LogRecord.Level.Value('INFO')
 | |
| 78 | +    # Warning message severity level.
 | |
| 79 | +    WARNING = monitoring_pb2.LogRecord.Level.Value('WARNING')
 | |
| 80 | +    # Error message severity level.
 | |
| 81 | +    ERROR = monitoring_pb2.LogRecord.Level.Value('ERROR')
 | |
| 82 | +    # Critical message severity level.
 | |
| 83 | +    CRITICAL = monitoring_pb2.LogRecord.Level.Value('CRITICAL')
 | |
| 84 | + | |
| 85 | + | |
| 86 | +class MetricRecordDomain(Enum):
 | |
| 87 | +    # Initially unknown domain.
 | |
| 88 | +    UNKNOWN = monitoring_pb2.MetricRecord.Domain.Value('UNKNOWN')
 | |
| 89 | +    # A server state related metric.
 | |
| 90 | +    STATE = monitoring_pb2.MetricRecord.Domain.Value('STATE')
 | |
| 91 | +    # A build execution related metric.
 | |
| 92 | +    BUILD = monitoring_pb2.MetricRecord.Domain.Value('BUILD')
 | |
| 93 | + | |
| 94 | + | |
| 95 | +class MetricRecordType(Enum):
 | |
| 96 | +    # Initially unknown type.
 | |
| 97 | +    NONE = monitoring_pb2.MetricRecord.Type.Value('NONE')
 | |
| 98 | +    # A metric for counting.
 | |
| 99 | +    COUNTER = monitoring_pb2.MetricRecord.Type.Value('COUNTER')
 | |
| 100 | +    # A metric for mesuring a duration.
 | |
| 101 | +    TIMER = monitoring_pb2.MetricRecord.Type.Value('TIMER')
 | |
| 102 | +    # A metric in arbitrary value.
 | |
| 103 | +    GAUGE = monitoring_pb2.MetricRecord.Type.Value('GAUGE') | 
| 1 | +// Copyright (C) 2018 Bloomberg LP
 | |
| 2 | +//
 | |
| 3 | +// Licensed under the Apache License, Version 2.0 (the "License");
 | |
| 4 | +// you may not use this file except in compliance with the License.
 | |
| 5 | +// You may obtain a copy of the License at
 | |
| 6 | +//
 | |
| 7 | +//  <http://www.apache.org/licenses/LICENSE-2.0>
 | |
| 8 | +//
 | |
| 9 | +// Unless required by applicable law or agreed to in writing, software
 | |
| 10 | +// distributed under the License is distributed on an "AS IS" BASIS,
 | |
| 11 | +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| 12 | +// See the License for the specific language governing permissions and
 | |
| 13 | +// limitations under the License.
 | |
| 14 | + | |
| 15 | +syntax = "proto3";
 | |
| 16 | + | |
| 17 | +package buildgrid.v2;
 | |
| 18 | + | |
| 19 | +import "google/api/annotations.proto";
 | |
| 20 | +import "google/protobuf/duration.proto";
 | |
| 21 | +import "google/protobuf/timestamp.proto";
 | |
| 22 | + | |
| 23 | +message BusMessage {
 | |
| 24 | +  // The position of this message in the bus stream.
 | |
| 25 | +  int64 sequence_number = 1;
 | |
| 26 | + | |
| 27 | +  // The carried message.
 | |
| 28 | +  oneof record {
 | |
| 29 | +    LogRecord log_record = 2;
 | |
| 30 | +    MetricRecord metric_record = 3;
 | |
| 31 | +  }
 | |
| 32 | +}
 | |
| 33 | + | |
| 34 | +message LogRecord {
 | |
| 35 | +  // When the record has been created.
 | |
| 36 | +  google.protobuf.Timestamp creation_timestamp = 1;
 | |
| 37 | + | |
| 38 | +  enum Level {
 | |
| 39 | +    NOTSET = 0;
 | |
| 40 | +    // Debug message severity level.
 | |
| 41 | +    DEBUG = 1;
 | |
| 42 | +    // Information message severity level.
 | |
| 43 | +    INFO = 2;
 | |
| 44 | +    // Warning message severity level.
 | |
| 45 | +    WARNING = 3;
 | |
| 46 | +    // Error message severity level.
 | |
| 47 | +    ERROR = 4;
 | |
| 48 | +    // Critical message severity level.
 | |
| 49 | +    CRITICAL = 5;
 | |
| 50 | +  }
 | |
| 51 | + | |
| 52 | +  // The domain name for the record.
 | |
| 53 | +  string domain = 2;
 | |
| 54 | + | |
| 55 | +  // The severity level of the record.
 | |
| 56 | +  Level level = 3;
 | |
| 57 | + | |
| 58 | +  // The human-readable record's message.
 | |
| 59 | +  string message = 4;
 | |
| 60 | + | |
| 61 | +  // An optional list of additional metadata.
 | |
| 62 | +  map<string, string> extra = 5;
 | |
| 63 | +}
 | |
| 64 | + | |
| 65 | +message MetricRecord {
 | |
| 66 | +  // When the metric has been created.
 | |
| 67 | +  google.protobuf.Timestamp creation_timestamp = 1;
 | |
| 68 | + | |
| 69 | +  enum Domain {
 | |
| 70 | +    UNKNOWN = 0;
 | |
| 71 | +    // A server state related metric.
 | |
| 72 | +    STATE = 1;
 | |
| 73 | +    // A build execution related metric.
 | |
| 74 | +    BUILD = 2;
 | |
| 75 | +  }
 | |
| 76 | + | |
| 77 | +  // The domain for the record.
 | |
| 78 | +  Domain domain = 2;
 | |
| 79 | + | |
| 80 | +  enum Type {
 | |
| 81 | +    NONE = 0;
 | |
| 82 | +    // A metric for counting.
 | |
| 83 | +    COUNTER = 1;
 | |
| 84 | +    // A metric for mesuring a duration.
 | |
| 85 | +    TIMER = 2;
 | |
| 86 | +    // A metric in arbitrary value.
 | |
| 87 | +    GAUGE = 3;
 | |
| 88 | +  }
 | |
| 89 | + | |
| 90 | +  // The type of metric, see Type.
 | |
| 91 | +  Type type = 3;
 | |
| 92 | + | |
| 93 | +  // The name identifying the metric.
 | |
| 94 | +  string name = 4;
 | |
| 95 | + | |
| 96 | +  // The carried value, depending on the metric's type.
 | |
| 97 | +  oneof data {
 | |
| 98 | +    // Set for Type.COUNTER metrics.
 | |
| 99 | +    int32 count = 5;
 | |
| 100 | +    // Set for Type.TIMER metrics.
 | |
| 101 | +    google.protobuf.Duration duration = 6;
 | |
| 102 | +    // Set for Type.GAUGE metrics.
 | |
| 103 | +    int32 value = 7;
 | |
| 104 | +  }
 | |
| 105 | + | |
| 106 | +  // An optional list of additional metadata.
 | |
| 107 | +  map<string, string> extra = 8;
 | |
| 108 | +} | |
| \ No newline at end of file | 
| 1 | +# Generated by the protocol buffer compiler.  DO NOT EDIT!
 | |
| 2 | +# source: buildgrid/v2/monitoring.proto
 | |
| 3 | + | |
| 4 | +import sys
 | |
| 5 | +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
 | |
| 6 | +from google.protobuf import descriptor as _descriptor
 | |
| 7 | +from google.protobuf import message as _message
 | |
| 8 | +from google.protobuf import reflection as _reflection
 | |
| 9 | +from google.protobuf import symbol_database as _symbol_database
 | |
| 10 | +# @@protoc_insertion_point(imports)
 | |
| 11 | + | |
| 12 | +_sym_db = _symbol_database.Default()
 | |
| 13 | + | |
| 14 | + | |
| 15 | +from buildgrid._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
 | |
| 16 | +from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
 | |
| 17 | +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
 | |
| 18 | + | |
| 19 | + | |
| 20 | +DESCRIPTOR = _descriptor.FileDescriptor(
 | |
| 21 | +  name='buildgrid/v2/monitoring.proto',
 | |
| 22 | +  package='buildgrid.v2',
 | |
| 23 | +  syntax='proto3',
 | |
| 24 | +  serialized_options=None,
 | |
| 25 | +  serialized_pb=_b('\n\x1d\x62uildgrid/v2/monitoring.proto\x12\x0c\x62uildgrid.v2\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x93\x01\n\nBusMessage\x12\x17\n\x0fsequence_number\x18\x01 \x01(\x03\x12-\n\nlog_record\x18\x02 \x01(\x0b\x32\x17.buildgrid.v2.LogRecordH\x00\x12\x33\n\rmetric_record\x18\x03 \x01(\x0b\x32\x1a.buildgrid.v2.MetricRecordH\x00\x42\x08\n\x06record\"\xc3\x02\n\tLogRecord\x12\x36\n\x12\x63reation_timestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06\x64omain\x18\x02 \x01(\t\x12,\n\x05level\x18\x03 \x01(\x0e\x32\x1d.buildgrid.v2.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\t\x12\x31\n\x05\x65xtra\x18\x05 \x03(\x0b\x32\".buildgrid.v2.LogRecord.ExtraEntry\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"N\n\x05Level\x12\n\n\x06NOTSET\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x01\x12\x08\n\x04INFO\x10\x02\x12\x0b\n\x07WARNING\x10\x03\x12\t\n\x05\x45RROR\x10\x04\x12\x0c\n\x08\x43RITICAL\x10\x05\"\xd5\x03\n\x0cMetricRecord\x12\x36\n\x12\x63reation_timestamp\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\x06\x64omain\x18\x02 \x01(\x0e\x32!.buildgrid.v2.MetricRecord.Domain\x12-\n\x04type\x18\x03 \x01(\x0e\x32\x1f.buildgrid.v2.MetricRecord.Type\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0f\n\x05\x63ount\x18\x05 \x01(\x05H\x00\x12-\n\x08\x64uration\x18\x06 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00\x12\x0f\n\x05value\x18\x07 \x01(\x05H\x00\x12\x34\n\x05\x65xtra\x18\x08 \x03(\x0b\x32%.buildgrid.v2.MetricRecord.ExtraEntry\x1a,\n\nExtraEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"+\n\x06\x44omain\x12\x0b\n\x07UNKNOWN\x10\x00\x12\t\n\x05STATE\x10\x01\x12\t\n\x05\x42UILD\x10\x02\"3\n\x04Type\x12\x08\n\x04NONE\x10\x00\x12\x0b\n\x07\x43OUNTER\x10\x01\x12\t\n\x05TIMER\x10\x02\x12\t\n\x05GAUGE\x10\x03\x42\x06\n\x04\x64\x61tab\x06proto3')
 | |
| 26 | +  ,
 | |
| 27 | +  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,])
 | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | +_LOGRECORD_LEVEL = _descriptor.EnumDescriptor(
 | |
| 32 | +  name='Level',
 | |
| 33 | +  full_name='buildgrid.v2.LogRecord.Level',
 | |
| 34 | +  filename=None,
 | |
| 35 | +  file=DESCRIPTOR,
 | |
| 36 | +  values=[
 | |
| 37 | +    _descriptor.EnumValueDescriptor(
 | |
| 38 | +      name='NOTSET', index=0, number=0,
 | |
| 39 | +      serialized_options=None,
 | |
| 40 | +      type=None),
 | |
| 41 | +    _descriptor.EnumValueDescriptor(
 | |
| 42 | +      name='DEBUG', index=1, number=1,
 | |
| 43 | +      serialized_options=None,
 | |
| 44 | +      type=None),
 | |
| 45 | +    _descriptor.EnumValueDescriptor(
 | |
| 46 | +      name='INFO', index=2, number=2,
 | |
| 47 | +      serialized_options=None,
 | |
| 48 | +      type=None),
 | |
| 49 | +    _descriptor.EnumValueDescriptor(
 | |
| 50 | +      name='WARNING', index=3, number=3,
 | |
| 51 | +      serialized_options=None,
 | |
| 52 | +      type=None),
 | |
| 53 | +    _descriptor.EnumValueDescriptor(
 | |
| 54 | +      name='ERROR', index=4, number=4,
 | |
| 55 | +      serialized_options=None,
 | |
| 56 | +      type=None),
 | |
| 57 | +    _descriptor.EnumValueDescriptor(
 | |
| 58 | +      name='CRITICAL', index=5, number=5,
 | |
| 59 | +      serialized_options=None,
 | |
| 60 | +      type=None),
 | |
| 61 | +  ],
 | |
| 62 | +  containing_type=None,
 | |
| 63 | +  serialized_options=None,
 | |
| 64 | +  serialized_start=538,
 | |
| 65 | +  serialized_end=616,
 | |
| 66 | +)
 | |
| 67 | +_sym_db.RegisterEnumDescriptor(_LOGRECORD_LEVEL)
 | |
| 68 | + | |
| 69 | +_METRICRECORD_DOMAIN = _descriptor.EnumDescriptor(
 | |
| 70 | +  name='Domain',
 | |
| 71 | +  full_name='buildgrid.v2.MetricRecord.Domain',
 | |
| 72 | +  filename=None,
 | |
| 73 | +  file=DESCRIPTOR,
 | |
| 74 | +  values=[
 | |
| 75 | +    _descriptor.EnumValueDescriptor(
 | |
| 76 | +      name='UNKNOWN', index=0, number=0,
 | |
| 77 | +      serialized_options=None,
 | |
| 78 | +      type=None),
 | |
| 79 | +    _descriptor.EnumValueDescriptor(
 | |
| 80 | +      name='STATE', index=1, number=1,
 | |
| 81 | +      serialized_options=None,
 | |
| 82 | +      type=None),
 | |
| 83 | +    _descriptor.EnumValueDescriptor(
 | |
| 84 | +      name='BUILD', index=2, number=2,
 | |
| 85 | +      serialized_options=None,
 | |
| 86 | +      type=None),
 | |
| 87 | +  ],
 | |
| 88 | +  containing_type=None,
 | |
| 89 | +  serialized_options=None,
 | |
| 90 | +  serialized_start=984,
 | |
| 91 | +  serialized_end=1027,
 | |
| 92 | +)
 | |
| 93 | +_sym_db.RegisterEnumDescriptor(_METRICRECORD_DOMAIN)
 | |
| 94 | + | |
| 95 | +_METRICRECORD_TYPE = _descriptor.EnumDescriptor(
 | |
| 96 | +  name='Type',
 | |
| 97 | +  full_name='buildgrid.v2.MetricRecord.Type',
 | |
| 98 | +  filename=None,
 | |
| 99 | +  file=DESCRIPTOR,
 | |
| 100 | +  values=[
 | |
| 101 | +    _descriptor.EnumValueDescriptor(
 | |
| 102 | +      name='NONE', index=0, number=0,
 | |
| 103 | +      serialized_options=None,
 | |
| 104 | +      type=None),
 | |
| 105 | +    _descriptor.EnumValueDescriptor(
 | |
| 106 | +      name='COUNTER', index=1, number=1,
 | |
| 107 | +      serialized_options=None,
 | |
| 108 | +      type=None),
 | |
| 109 | +    _descriptor.EnumValueDescriptor(
 | |
| 110 | +      name='TIMER', index=2, number=2,
 | |
| 111 | +      serialized_options=None,
 | |
| 112 | +      type=None),
 | |
| 113 | +    _descriptor.EnumValueDescriptor(
 | |
| 114 | +      name='GAUGE', index=3, number=3,
 | |
| 115 | +      serialized_options=None,
 | |
| 116 | +      type=None),
 | |
| 117 | +  ],
 | |
| 118 | +  containing_type=None,
 | |
| 119 | +  serialized_options=None,
 | |
| 120 | +  serialized_start=1029,
 | |
| 121 | +  serialized_end=1080,
 | |
| 122 | +)
 | |
| 123 | +_sym_db.RegisterEnumDescriptor(_METRICRECORD_TYPE)
 | |
| 124 | + | |
| 125 | + | |
| 126 | +_BUSMESSAGE = _descriptor.Descriptor(
 | |
| 127 | +  name='BusMessage',
 | |
| 128 | +  full_name='buildgrid.v2.BusMessage',
 | |
| 129 | +  filename=None,
 | |
| 130 | +  file=DESCRIPTOR,
 | |
| 131 | +  containing_type=None,
 | |
| 132 | +  fields=[
 | |
| 133 | +    _descriptor.FieldDescriptor(
 | |
| 134 | +      name='sequence_number', full_name='buildgrid.v2.BusMessage.sequence_number', index=0,
 | |
| 135 | +      number=1, type=3, cpp_type=2, label=1,
 | |
| 136 | +      has_default_value=False, default_value=0,
 | |
| 137 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 138 | +      is_extension=False, extension_scope=None,
 | |
| 139 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 140 | +    _descriptor.FieldDescriptor(
 | |
| 141 | +      name='log_record', full_name='buildgrid.v2.BusMessage.log_record', index=1,
 | |
| 142 | +      number=2, type=11, cpp_type=10, label=1,
 | |
| 143 | +      has_default_value=False, default_value=None,
 | |
| 144 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 145 | +      is_extension=False, extension_scope=None,
 | |
| 146 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 147 | +    _descriptor.FieldDescriptor(
 | |
| 148 | +      name='metric_record', full_name='buildgrid.v2.BusMessage.metric_record', index=2,
 | |
| 149 | +      number=3, type=11, cpp_type=10, label=1,
 | |
| 150 | +      has_default_value=False, default_value=None,
 | |
| 151 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 152 | +      is_extension=False, extension_scope=None,
 | |
| 153 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 154 | +  ],
 | |
| 155 | +  extensions=[
 | |
| 156 | +  ],
 | |
| 157 | +  nested_types=[],
 | |
| 158 | +  enum_types=[
 | |
| 159 | +  ],
 | |
| 160 | +  serialized_options=None,
 | |
| 161 | +  is_extendable=False,
 | |
| 162 | +  syntax='proto3',
 | |
| 163 | +  extension_ranges=[],
 | |
| 164 | +  oneofs=[
 | |
| 165 | +    _descriptor.OneofDescriptor(
 | |
| 166 | +      name='record', full_name='buildgrid.v2.BusMessage.record',
 | |
| 167 | +      index=0, containing_type=None, fields=[]),
 | |
| 168 | +  ],
 | |
| 169 | +  serialized_start=143,
 | |
| 170 | +  serialized_end=290,
 | |
| 171 | +)
 | |
| 172 | + | |
| 173 | + | |
| 174 | +_LOGRECORD_EXTRAENTRY = _descriptor.Descriptor(
 | |
| 175 | +  name='ExtraEntry',
 | |
| 176 | +  full_name='buildgrid.v2.LogRecord.ExtraEntry',
 | |
| 177 | +  filename=None,
 | |
| 178 | +  file=DESCRIPTOR,
 | |
| 179 | +  containing_type=None,
 | |
| 180 | +  fields=[
 | |
| 181 | +    _descriptor.FieldDescriptor(
 | |
| 182 | +      name='key', full_name='buildgrid.v2.LogRecord.ExtraEntry.key', index=0,
 | |
| 183 | +      number=1, type=9, cpp_type=9, label=1,
 | |
| 184 | +      has_default_value=False, default_value=_b("").decode('utf-8'),
 | |
| 185 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 186 | +      is_extension=False, extension_scope=None,
 | |
| 187 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 188 | +    _descriptor.FieldDescriptor(
 | |
| 189 | +      name='value', full_name='buildgrid.v2.LogRecord.ExtraEntry.value', index=1,
 | |
| 190 | +      number=2, type=9, cpp_type=9, label=1,
 | |
| 191 | +      has_default_value=False, default_value=_b("").decode('utf-8'),
 | |
| 192 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 193 | +      is_extension=False, extension_scope=None,
 | |
| 194 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 195 | +  ],
 | |
| 196 | +  extensions=[
 | |
| 197 | +  ],
 | |
| 198 | +  nested_types=[],
 | |
| 199 | +  enum_types=[
 | |
| 200 | +  ],
 | |
| 201 | +  serialized_options=_b('8\001'),
 | |
| 202 | +  is_extendable=False,
 | |
| 203 | +  syntax='proto3',
 | |
| 204 | +  extension_ranges=[],
 | |
| 205 | +  oneofs=[
 | |
| 206 | +  ],
 | |
| 207 | +  serialized_start=492,
 | |
| 208 | +  serialized_end=536,
 | |
| 209 | +)
 | |
| 210 | + | |
| 211 | +_LOGRECORD = _descriptor.Descriptor(
 | |
| 212 | +  name='LogRecord',
 | |
| 213 | +  full_name='buildgrid.v2.LogRecord',
 | |
| 214 | +  filename=None,
 | |
| 215 | +  file=DESCRIPTOR,
 | |
| 216 | +  containing_type=None,
 | |
| 217 | +  fields=[
 | |
| 218 | +    _descriptor.FieldDescriptor(
 | |
| 219 | +      name='creation_timestamp', full_name='buildgrid.v2.LogRecord.creation_timestamp', index=0,
 | |
| 220 | +      number=1, type=11, cpp_type=10, label=1,
 | |
| 221 | +      has_default_value=False, default_value=None,
 | |
| 222 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 223 | +      is_extension=False, extension_scope=None,
 | |
| 224 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 225 | +    _descriptor.FieldDescriptor(
 | |
| 226 | +      name='domain', full_name='buildgrid.v2.LogRecord.domain', index=1,
 | |
| 227 | +      number=2, type=9, cpp_type=9, label=1,
 | |
| 228 | +      has_default_value=False, default_value=_b("").decode('utf-8'),
 | |
| 229 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 230 | +      is_extension=False, extension_scope=None,
 | |
| 231 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 232 | +    _descriptor.FieldDescriptor(
 | |
| 233 | +      name='level', full_name='buildgrid.v2.LogRecord.level', index=2,
 | |
| 234 | +      number=3, type=14, cpp_type=8, label=1,
 | |
| 235 | +      has_default_value=False, default_value=0,
 | |
| 236 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 237 | +      is_extension=False, extension_scope=None,
 | |
| 238 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 239 | +    _descriptor.FieldDescriptor(
 | |
| 240 | +      name='message', full_name='buildgrid.v2.LogRecord.message', index=3,
 | |
| 241 | +      number=4, type=9, cpp_type=9, label=1,
 | |
| 242 | +      has_default_value=False, default_value=_b("").decode('utf-8'),
 | |
| 243 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 244 | +      is_extension=False, extension_scope=None,
 | |
| 245 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 246 | +    _descriptor.FieldDescriptor(
 | |
| 247 | +      name='extra', full_name='buildgrid.v2.LogRecord.extra', index=4,
 | |
| 248 | +      number=5, type=11, cpp_type=10, label=3,
 | |
| 249 | +      has_default_value=False, default_value=[],
 | |
| 250 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 251 | +      is_extension=False, extension_scope=None,
 | |
| 252 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 253 | +  ],
 | |
| 254 | +  extensions=[
 | |
| 255 | +  ],
 | |
| 256 | +  nested_types=[_LOGRECORD_EXTRAENTRY, ],
 | |
| 257 | +  enum_types=[
 | |
| 258 | +    _LOGRECORD_LEVEL,
 | |
| 259 | +  ],
 | |
| 260 | +  serialized_options=None,
 | |
| 261 | +  is_extendable=False,
 | |
| 262 | +  syntax='proto3',
 | |
| 263 | +  extension_ranges=[],
 | |
| 264 | +  oneofs=[
 | |
| 265 | +  ],
 | |
| 266 | +  serialized_start=293,
 | |
| 267 | +  serialized_end=616,
 | |
| 268 | +)
 | |
| 269 | + | |
| 270 | + | |
| 271 | +_METRICRECORD_EXTRAENTRY = _descriptor.Descriptor(
 | |
| 272 | +  name='ExtraEntry',
 | |
| 273 | +  full_name='buildgrid.v2.MetricRecord.ExtraEntry',
 | |
| 274 | +  filename=None,
 | |
| 275 | +  file=DESCRIPTOR,
 | |
| 276 | +  containing_type=None,
 | |
| 277 | +  fields=[
 | |
| 278 | +    _descriptor.FieldDescriptor(
 | |
| 279 | +      name='key', full_name='buildgrid.v2.MetricRecord.ExtraEntry.key', index=0,
 | |
| 280 | +      number=1, type=9, cpp_type=9, label=1,
 | |
| 281 | +      has_default_value=False, default_value=_b("").decode('utf-8'),
 | |
| 282 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 283 | +      is_extension=False, extension_scope=None,
 | |
| 284 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 285 | +    _descriptor.FieldDescriptor(
 | |
| 286 | +      name='value', full_name='buildgrid.v2.MetricRecord.ExtraEntry.value', index=1,
 | |
| 287 | +      number=2, type=9, cpp_type=9, label=1,
 | |
| 288 | +      has_default_value=False, default_value=_b("").decode('utf-8'),
 | |
| 289 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 290 | +      is_extension=False, extension_scope=None,
 | |
| 291 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 292 | +  ],
 | |
| 293 | +  extensions=[
 | |
| 294 | +  ],
 | |
| 295 | +  nested_types=[],
 | |
| 296 | +  enum_types=[
 | |
| 297 | +  ],
 | |
| 298 | +  serialized_options=_b('8\001'),
 | |
| 299 | +  is_extendable=False,
 | |
| 300 | +  syntax='proto3',
 | |
| 301 | +  extension_ranges=[],
 | |
| 302 | +  oneofs=[
 | |
| 303 | +  ],
 | |
| 304 | +  serialized_start=492,
 | |
| 305 | +  serialized_end=536,
 | |
| 306 | +)
 | |
| 307 | + | |
| 308 | +_METRICRECORD = _descriptor.Descriptor(
 | |
| 309 | +  name='MetricRecord',
 | |
| 310 | +  full_name='buildgrid.v2.MetricRecord',
 | |
| 311 | +  filename=None,
 | |
| 312 | +  file=DESCRIPTOR,
 | |
| 313 | +  containing_type=None,
 | |
| 314 | +  fields=[
 | |
| 315 | +    _descriptor.FieldDescriptor(
 | |
| 316 | +      name='creation_timestamp', full_name='buildgrid.v2.MetricRecord.creation_timestamp', index=0,
 | |
| 317 | +      number=1, type=11, cpp_type=10, label=1,
 | |
| 318 | +      has_default_value=False, default_value=None,
 | |
| 319 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 320 | +      is_extension=False, extension_scope=None,
 | |
| 321 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 322 | +    _descriptor.FieldDescriptor(
 | |
| 323 | +      name='domain', full_name='buildgrid.v2.MetricRecord.domain', index=1,
 | |
| 324 | +      number=2, type=14, cpp_type=8, label=1,
 | |
| 325 | +      has_default_value=False, default_value=0,
 | |
| 326 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 327 | +      is_extension=False, extension_scope=None,
 | |
| 328 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 329 | +    _descriptor.FieldDescriptor(
 | |
| 330 | +      name='type', full_name='buildgrid.v2.MetricRecord.type', index=2,
 | |
| 331 | +      number=3, type=14, cpp_type=8, label=1,
 | |
| 332 | +      has_default_value=False, default_value=0,
 | |
| 333 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 334 | +      is_extension=False, extension_scope=None,
 | |
| 335 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 336 | +    _descriptor.FieldDescriptor(
 | |
| 337 | +      name='name', full_name='buildgrid.v2.MetricRecord.name', index=3,
 | |
| 338 | +      number=4, type=9, cpp_type=9, label=1,
 | |
| 339 | +      has_default_value=False, default_value=_b("").decode('utf-8'),
 | |
| 340 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 341 | +      is_extension=False, extension_scope=None,
 | |
| 342 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 343 | +    _descriptor.FieldDescriptor(
 | |
| 344 | +      name='count', full_name='buildgrid.v2.MetricRecord.count', index=4,
 | |
| 345 | +      number=5, type=5, cpp_type=1, label=1,
 | |
| 346 | +      has_default_value=False, default_value=0,
 | |
| 347 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 348 | +      is_extension=False, extension_scope=None,
 | |
| 349 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 350 | +    _descriptor.FieldDescriptor(
 | |
| 351 | +      name='duration', full_name='buildgrid.v2.MetricRecord.duration', index=5,
 | |
| 352 | +      number=6, type=11, cpp_type=10, label=1,
 | |
| 353 | +      has_default_value=False, default_value=None,
 | |
| 354 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 355 | +      is_extension=False, extension_scope=None,
 | |
| 356 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 357 | +    _descriptor.FieldDescriptor(
 | |
| 358 | +      name='value', full_name='buildgrid.v2.MetricRecord.value', index=6,
 | |
| 359 | +      number=7, type=5, cpp_type=1, label=1,
 | |
| 360 | +      has_default_value=False, default_value=0,
 | |
| 361 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 362 | +      is_extension=False, extension_scope=None,
 | |
| 363 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 364 | +    _descriptor.FieldDescriptor(
 | |
| 365 | +      name='extra', full_name='buildgrid.v2.MetricRecord.extra', index=7,
 | |
| 366 | +      number=8, type=11, cpp_type=10, label=3,
 | |
| 367 | +      has_default_value=False, default_value=[],
 | |
| 368 | +      message_type=None, enum_type=None, containing_type=None,
 | |
| 369 | +      is_extension=False, extension_scope=None,
 | |
| 370 | +      serialized_options=None, file=DESCRIPTOR),
 | |
| 371 | +  ],
 | |
| 372 | +  extensions=[
 | |
| 373 | +  ],
 | |
| 374 | +  nested_types=[_METRICRECORD_EXTRAENTRY, ],
 | |
| 375 | +  enum_types=[
 | |
| 376 | +    _METRICRECORD_DOMAIN,
 | |
| 377 | +    _METRICRECORD_TYPE,
 | |
| 378 | +  ],
 | |
| 379 | +  serialized_options=None,
 | |
| 380 | +  is_extendable=False,
 | |
| 381 | +  syntax='proto3',
 | |
| 382 | +  extension_ranges=[],
 | |
| 383 | +  oneofs=[
 | |
| 384 | +    _descriptor.OneofDescriptor(
 | |
| 385 | +      name='data', full_name='buildgrid.v2.MetricRecord.data',
 | |
| 386 | +      index=0, containing_type=None, fields=[]),
 | |
| 387 | +  ],
 | |
| 388 | +  serialized_start=619,
 | |
| 389 | +  serialized_end=1088,
 | |
| 390 | +)
 | |
| 391 | + | |
| 392 | +_BUSMESSAGE.fields_by_name['log_record'].message_type = _LOGRECORD
 | |
| 393 | +_BUSMESSAGE.fields_by_name['metric_record'].message_type = _METRICRECORD
 | |
| 394 | +_BUSMESSAGE.oneofs_by_name['record'].fields.append(
 | |
| 395 | +  _BUSMESSAGE.fields_by_name['log_record'])
 | |
| 396 | +_BUSMESSAGE.fields_by_name['log_record'].containing_oneof = _BUSMESSAGE.oneofs_by_name['record']
 | |
| 397 | +_BUSMESSAGE.oneofs_by_name['record'].fields.append(
 | |
| 398 | +  _BUSMESSAGE.fields_by_name['metric_record'])
 | |
| 399 | +_BUSMESSAGE.fields_by_name['metric_record'].containing_oneof = _BUSMESSAGE.oneofs_by_name['record']
 | |
| 400 | +_LOGRECORD_EXTRAENTRY.containing_type = _LOGRECORD
 | |
| 401 | +_LOGRECORD.fields_by_name['creation_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
 | |
| 402 | +_LOGRECORD.fields_by_name['level'].enum_type = _LOGRECORD_LEVEL
 | |
| 403 | +_LOGRECORD.fields_by_name['extra'].message_type = _LOGRECORD_EXTRAENTRY
 | |
| 404 | +_LOGRECORD_LEVEL.containing_type = _LOGRECORD
 | |
| 405 | +_METRICRECORD_EXTRAENTRY.containing_type = _METRICRECORD
 | |
| 406 | +_METRICRECORD.fields_by_name['creation_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
 | |
| 407 | +_METRICRECORD.fields_by_name['domain'].enum_type = _METRICRECORD_DOMAIN
 | |
| 408 | +_METRICRECORD.fields_by_name['type'].enum_type = _METRICRECORD_TYPE
 | |
| 409 | +_METRICRECORD.fields_by_name['duration'].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
 | |
| 410 | +_METRICRECORD.fields_by_name['extra'].message_type = _METRICRECORD_EXTRAENTRY
 | |
| 411 | +_METRICRECORD_DOMAIN.containing_type = _METRICRECORD
 | |
| 412 | +_METRICRECORD_TYPE.containing_type = _METRICRECORD
 | |
| 413 | +_METRICRECORD.oneofs_by_name['data'].fields.append(
 | |
| 414 | +  _METRICRECORD.fields_by_name['count'])
 | |
| 415 | +_METRICRECORD.fields_by_name['count'].containing_oneof = _METRICRECORD.oneofs_by_name['data']
 | |
| 416 | +_METRICRECORD.oneofs_by_name['data'].fields.append(
 | |
| 417 | +  _METRICRECORD.fields_by_name['duration'])
 | |
| 418 | +_METRICRECORD.fields_by_name['duration'].containing_oneof = _METRICRECORD.oneofs_by_name['data']
 | |
| 419 | +_METRICRECORD.oneofs_by_name['data'].fields.append(
 | |
| 420 | +  _METRICRECORD.fields_by_name['value'])
 | |
| 421 | +_METRICRECORD.fields_by_name['value'].containing_oneof = _METRICRECORD.oneofs_by_name['data']
 | |
| 422 | +DESCRIPTOR.message_types_by_name['BusMessage'] = _BUSMESSAGE
 | |
| 423 | +DESCRIPTOR.message_types_by_name['LogRecord'] = _LOGRECORD
 | |
| 424 | +DESCRIPTOR.message_types_by_name['MetricRecord'] = _METRICRECORD
 | |
| 425 | +_sym_db.RegisterFileDescriptor(DESCRIPTOR)
 | |
| 426 | + | |
| 427 | +BusMessage = _reflection.GeneratedProtocolMessageType('BusMessage', (_message.Message,), dict(
 | |
| 428 | +  DESCRIPTOR = _BUSMESSAGE,
 | |
| 429 | +  __module__ = 'buildgrid.v2.monitoring_pb2'
 | |
| 430 | +  # @@protoc_insertion_point(class_scope:buildgrid.v2.BusMessage)
 | |
| 431 | +  ))
 | |
| 432 | +_sym_db.RegisterMessage(BusMessage)
 | |
| 433 | + | |
| 434 | +LogRecord = _reflection.GeneratedProtocolMessageType('LogRecord', (_message.Message,), dict(
 | |
| 435 | + | |
| 436 | +  ExtraEntry = _reflection.GeneratedProtocolMessageType('ExtraEntry', (_message.Message,), dict(
 | |
| 437 | +    DESCRIPTOR = _LOGRECORD_EXTRAENTRY,
 | |
| 438 | +    __module__ = 'buildgrid.v2.monitoring_pb2'
 | |
| 439 | +    # @@protoc_insertion_point(class_scope:buildgrid.v2.LogRecord.ExtraEntry)
 | |
| 440 | +    ))
 | |
| 441 | +  ,
 | |
| 442 | +  DESCRIPTOR = _LOGRECORD,
 | |
| 443 | +  __module__ = 'buildgrid.v2.monitoring_pb2'
 | |
| 444 | +  # @@protoc_insertion_point(class_scope:buildgrid.v2.LogRecord)
 | |
| 445 | +  ))
 | |
| 446 | +_sym_db.RegisterMessage(LogRecord)
 | |
| 447 | +_sym_db.RegisterMessage(LogRecord.ExtraEntry)
 | |
| 448 | + | |
| 449 | +MetricRecord = _reflection.GeneratedProtocolMessageType('MetricRecord', (_message.Message,), dict(
 | |
| 450 | + | |
| 451 | +  ExtraEntry = _reflection.GeneratedProtocolMessageType('ExtraEntry', (_message.Message,), dict(
 | |
| 452 | +    DESCRIPTOR = _METRICRECORD_EXTRAENTRY,
 | |
| 453 | +    __module__ = 'buildgrid.v2.monitoring_pb2'
 | |
| 454 | +    # @@protoc_insertion_point(class_scope:buildgrid.v2.MetricRecord.ExtraEntry)
 | |
| 455 | +    ))
 | |
| 456 | +  ,
 | |
| 457 | +  DESCRIPTOR = _METRICRECORD,
 | |
| 458 | +  __module__ = 'buildgrid.v2.monitoring_pb2'
 | |
| 459 | +  # @@protoc_insertion_point(class_scope:buildgrid.v2.MetricRecord)
 | |
| 460 | +  ))
 | |
| 461 | +_sym_db.RegisterMessage(MetricRecord)
 | |
| 462 | +_sym_db.RegisterMessage(MetricRecord.ExtraEntry)
 | |
| 463 | + | |
| 464 | + | |
| 465 | +_LOGRECORD_EXTRAENTRY._options = None
 | |
| 466 | +_METRICRECORD_EXTRAENTRY._options = None
 | |
| 467 | +# @@protoc_insertion_point(module_scope) | 
| 1 | +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 | |
| 2 | +import grpc
 | |
| 3 | + | 
| 1 | +# Copyright (C) 2018 Bloomberg LP
 | |
| 2 | +#
 | |
| 3 | +# Licensed under the Apache License, Version 2.0 (the "License");
 | |
| 4 | +# you may not use this file except in compliance with the License.
 | |
| 5 | +# You may obtain a copy of the License at
 | |
| 6 | +#
 | |
| 7 | +#  <http://www.apache.org/licenses/LICENSE-2.0>
 | |
| 8 | +#
 | |
| 9 | +# Unless required by applicable law or agreed to in writing, software
 | |
| 10 | +# distributed under the License is distributed on an "AS IS" BASIS,
 | |
| 11 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| 12 | +# See the License for the specific language governing permissions and
 | |
| 13 | +# limitations under the License.
 | |
| 14 | + | |
| 15 | + | |
| 16 | +import asyncio
 | |
| 17 | + | |
| 18 | +from google.protobuf import json_format
 | |
| 19 | + | |
| 20 | +from buildgrid._protos.buildgrid.v2 import monitoring_pb2
 | |
| 21 | + | |
| 22 | + | |
| 23 | +class MonitoringBus:
 | |
| 24 | + | |
| 25 | +    def __init__(self, loop):
 | |
| 26 | +        self.__event_loop = loop
 | |
| 27 | +        self.__streaming_task = None
 | |
| 28 | + | |
| 29 | +        self.__message_queue = asyncio.Queue(loop=loop)
 | |
| 30 | +        self.__sequence_number = 0
 | |
| 31 | + | |
| 32 | +    # --- Public API ---
 | |
| 33 | + | |
| 34 | +    def start(self):
 | |
| 35 | +        """Starts the monitoring bus worker task."""
 | |
| 36 | +        self.__streaming_task = asyncio.ensure_future(
 | |
| 37 | +            self._streaming_worker(), loop=self.__event_loop)
 | |
| 38 | + | |
| 39 | +    def stop(self):
 | |
| 40 | +        """Cancels the monitoring bus worker task."""
 | |
| 41 | +        if self.__streaming_task is not None:
 | |
| 42 | +            self.__streaming_task.cancel()
 | |
| 43 | + | |
| 44 | +    async def publish_record(self, record):
 | |
| 45 | +        """Posts a record onto the bus asynchronously.
 | |
| 46 | + | |
| 47 | +        Args:
 | |
| 48 | +            record (Message): The
 | |
| 49 | +        """
 | |
| 50 | +        await self.__message_queue.put(record)
 | |
| 51 | + | |
| 52 | +    def publish_record_nowait(self, record):
 | |
| 53 | +        """Posts a record onto the bus.
 | |
| 54 | + | |
| 55 | +        Args:
 | |
| 56 | +            record (Message): The
 | |
| 57 | +        """
 | |
| 58 | +        self.__message_queue.put_nowait(record)
 | |
| 59 | + | |
| 60 | +    # --- Private API ---
 | |
| 61 | + | |
| 62 | +    async def _streaming_worker(self):
 | |
| 63 | +        """Handles bus messages steaming work."""
 | |
| 64 | +        async def __streaming_worker(message_queue, sequence_number):
 | |
| 65 | +            record = await message_queue.get()
 | |
| 66 | + | |
| 67 | +            message = monitoring_pb2.BusMessage(sequence_number=sequence_number)
 | |
| 68 | +            if record.DESCRIPTOR is monitoring_pb2.LogRecord.DESCRIPTOR:
 | |
| 69 | +                message.log_record.CopyFrom(record)
 | |
| 70 | +            elif record.DESCRIPTOR is monitoring_pb2.MetricRecord.DESCRIPTOR:
 | |
| 71 | +                message.metric_record.CopyFrom(record)
 | |
| 72 | +            else:
 | |
| 73 | +                return False
 | |
| 74 | + | |
| 75 | +            print(json_format.MessageToJson(message))
 | |
| 76 | +            return True
 | |
| 77 | + | |
| 78 | +        try:
 | |
| 79 | +            while True:
 | |
| 80 | +                if await __streaming_worker(self.__message_queue,
 | |
| 81 | +                                            self.__sequence_number):
 | |
| 82 | +                    self.__sequence_number += 1
 | |
| 83 | + | |
| 84 | +        except asyncio.CancelledError:
 | |
| 85 | +            pass | 
| ... | ... | @@ -13,18 +13,21 @@ | 
| 13 | 13 |  # limitations under the License.
 | 
| 14 | 14 |  | 
| 15 | 15 |  | 
| 16 | +import asyncio
 | |
| 16 | 17 |  from concurrent import futures
 | 
| 17 | 18 |  import logging
 | 
| 18 | 19 |  import os
 | 
| 20 | +import time
 | |
| 19 | 21 |  | 
| 20 | 22 |  import grpc
 | 
| 21 | 23 |  | 
| 22 | -from .cas.service import ByteStreamService, ContentAddressableStorageService
 | |
| 23 | -from .actioncache.service import ActionCacheService
 | |
| 24 | -from .execution.service import ExecutionService
 | |
| 25 | -from .operations.service import OperationsService
 | |
| 26 | -from .bots.service import BotsService
 | |
| 27 | -from .referencestorage.service import ReferenceStorageService
 | |
| 24 | +from buildgrid.server.actioncache.service import ActionCacheService
 | |
| 25 | +from buildgrid.server.bots.service import BotsService
 | |
| 26 | +from buildgrid.server.cas.service import ByteStreamService, ContentAddressableStorageService
 | |
| 27 | +from buildgrid.server.execution.service import ExecutionService
 | |
| 28 | +from buildgrid.server._monitoring import MonitoringBus
 | |
| 29 | +from buildgrid.server.operations.service import OperationsService
 | |
| 30 | +from buildgrid.server.referencestorage.service import ReferenceStorageService
 | |
| 28 | 31 |  | 
| 29 | 32 |  | 
| 30 | 33 |  class BuildGridServer:
 | 
| ... | ... | @@ -34,7 +37,7 @@ class BuildGridServer: | 
| 34 | 37 |      requisite services.
 | 
| 35 | 38 |      """
 | 
| 36 | 39 |  | 
| 37 | -    def __init__(self, max_workers=None):
 | |
| 40 | +    def __init__(self, max_workers=None, monitor=True):
 | |
| 38 | 41 |          """Initializes a new :class:`BuildGridServer` instance.
 | 
| 39 | 42 |  | 
| 40 | 43 |          Args:
 | 
| ... | ... | @@ -46,9 +49,11 @@ class BuildGridServer: | 
| 46 | 49 |              # Use max_workers default from Python 3.5+
 | 
| 47 | 50 |              max_workers = (os.cpu_count() or 1) * 5
 | 
| 48 | 51 |  | 
| 49 | -        server = grpc.server(futures.ThreadPoolExecutor(max_workers))
 | |
| 52 | +        self.__grpc_executor = futures.ThreadPoolExecutor(max_workers)
 | |
| 53 | +        self.__grpc_server = grpc.server(self.__grpc_executor)
 | |
| 50 | 54 |  | 
| 51 | -        self._server = server
 | |
| 55 | +        self.__main_loop = asyncio.get_event_loop()
 | |
| 56 | +        self.__monitoring_bus = None
 | |
| 52 | 57 |  | 
| 53 | 58 |          self._execution_service = None
 | 
| 54 | 59 |          self._bots_service = None
 | 
| ... | ... | @@ -58,15 +63,35 @@ class BuildGridServer: | 
| 58 | 63 |          self._cas_service = None
 | 
| 59 | 64 |          self._bytestream_service = None
 | 
| 60 | 65 |  | 
| 66 | +        self._is_monitored = monitor
 | |
| 67 | + | |
| 68 | +        if self._is_monitored:
 | |
| 69 | +            self.__monitoring_bus = MonitoringBus(self.__main_loop)
 | |
| 70 | + | |
| 71 | +    # --- Public API ---
 | |
| 72 | + | |
| 61 | 73 |      def start(self):
 | 
| 62 | -        """Starts the server.
 | |
| 74 | +        """Starts the BuildGrid server.
 | |
| 63 | 75 |          """
 | 
| 64 | -        self._server.start()
 | |
| 76 | +        self.__grpc_server.start()
 | |
| 77 | + | |
| 78 | +        if self._is_monitored:
 | |
| 79 | +            self.__monitoring_bus.start()
 | |
| 80 | +        self.__main_loop.run_forever()
 | |
| 65 | 81 |  | 
| 66 | 82 |      def stop(self, grace=0):
 | 
| 67 | -        """Stops the server.
 | |
| 83 | +        """Stops the BuildGrid server.
 | |
| 84 | + | |
| 85 | +        Args:
 | |
| 86 | +            grace (int, optional): A duration of time in seconds. Defaults to 0.
 | |
| 68 | 87 |          """
 | 
| 69 | -        self._server.stop(grace)
 | |
| 88 | +        if self._is_monitored:
 | |
| 89 | +            self.__monitoring_bus.stop()
 | |
| 90 | + | |
| 91 | +        self.__grpc_server.stop(grace)
 | |
| 92 | + | |
| 93 | +        if grace > 0:
 | |
| 94 | +            time.sleep(grace)
 | |
| 70 | 95 |  | 
| 71 | 96 |      def add_port(self, address, credentials):
 | 
| 72 | 97 |          """Adds a port to the server.
 | 
| ... | ... | @@ -80,11 +105,11 @@ class BuildGridServer: | 
| 80 | 105 |          """
 | 
| 81 | 106 |          if credentials is not None:
 | 
| 82 | 107 |              self.__logger.info("Adding secure connection on: [%s]", address)
 | 
| 83 | -            self._server.add_secure_port(address, credentials)
 | |
| 108 | +            self.__grpc_server.add_secure_port(address, credentials)
 | |
| 84 | 109 |  | 
| 85 | 110 |          else:
 | 
| 86 | 111 |              self.__logger.info("Adding insecure connection on [%s]", address)
 | 
| 87 | -            self._server.add_insecure_port(address)
 | |
| 112 | +            self.__grpc_server.add_insecure_port(address)
 | |
| 88 | 113 |  | 
| 89 | 114 |      def add_execution_instance(self, instance, instance_name):
 | 
| 90 | 115 |          """Adds an :obj:`ExecutionInstance` to the service.
 | 
| ... | ... | @@ -96,7 +121,7 @@ class BuildGridServer: | 
| 96 | 121 |              instance_name (str): Instance name.
 | 
| 97 | 122 |          """
 | 
| 98 | 123 |          if self._execution_service is None:
 | 
| 99 | -            self._execution_service = ExecutionService(self._server)
 | |
| 124 | +            self._execution_service = ExecutionService(self.__grpc_server)
 | |
| 100 | 125 |  | 
| 101 | 126 |          self._execution_service.add_instance(instance_name, instance)
 | 
| 102 | 127 |  | 
| ... | ... | @@ -110,7 +135,7 @@ class BuildGridServer: | 
| 110 | 135 |              instance_name (str): Instance name.
 | 
| 111 | 136 |          """
 | 
| 112 | 137 |          if self._bots_service is None:
 | 
| 113 | -            self._bots_service = BotsService(self._server)
 | |
| 138 | +            self._bots_service = BotsService(self.__grpc_server)
 | |
| 114 | 139 |  | 
| 115 | 140 |          self._bots_service.add_instance(instance_name, instance)
 | 
| 116 | 141 |  | 
| ... | ... | @@ -124,7 +149,7 @@ class BuildGridServer: | 
| 124 | 149 |              instance_name (str): Instance name.
 | 
| 125 | 150 |          """
 | 
| 126 | 151 |          if self._operations_service is None:
 | 
| 127 | -            self._operations_service = OperationsService(self._server)
 | |
| 152 | +            self._operations_service = OperationsService(self.__grpc_server)
 | |
| 128 | 153 |  | 
| 129 | 154 |          self._operations_service.add_instance(instance_name, instance)
 | 
| 130 | 155 |  | 
| ... | ... | @@ -138,7 +163,7 @@ class BuildGridServer: | 
| 138 | 163 |              instance_name (str): Instance name.
 | 
| 139 | 164 |          """
 | 
| 140 | 165 |          if self._reference_storage_service is None:
 | 
| 141 | -            self._reference_storage_service = ReferenceStorageService(self._server)
 | |
| 166 | +            self._reference_storage_service = ReferenceStorageService(self.__grpc_server)
 | |
| 142 | 167 |  | 
| 143 | 168 |          self._reference_storage_service.add_instance(instance_name, instance)
 | 
| 144 | 169 |  | 
| ... | ... | @@ -152,7 +177,7 @@ class BuildGridServer: | 
| 152 | 177 |              instance_name (str): Instance name.
 | 
| 153 | 178 |          """
 | 
| 154 | 179 |          if self._action_cache_service is None:
 | 
| 155 | -            self._action_cache_service = ActionCacheService(self._server)
 | |
| 180 | +            self._action_cache_service = ActionCacheService(self.__grpc_server)
 | |
| 156 | 181 |  | 
| 157 | 182 |          self._action_cache_service.add_instance(instance_name, instance)
 | 
| 158 | 183 |  | 
| ... | ... | @@ -166,7 +191,7 @@ class BuildGridServer: | 
| 166 | 191 |              instance_name (str): Instance name.
 | 
| 167 | 192 |          """
 | 
| 168 | 193 |          if self._cas_service is None:
 | 
| 169 | -            self._cas_service = ContentAddressableStorageService(self._server)
 | |
| 194 | +            self._cas_service = ContentAddressableStorageService(self.__grpc_server)
 | |
| 170 | 195 |  | 
| 171 | 196 |          self._cas_service.add_instance(instance_name, instance)
 | 
| 172 | 197 |  | 
| ... | ... | @@ -180,6 +205,12 @@ class BuildGridServer: | 
| 180 | 205 |              instance_name (str): Instance name.
 | 
| 181 | 206 |          """
 | 
| 182 | 207 |          if self._bytestream_service is None:
 | 
| 183 | -            self._bytestream_service = ByteStreamService(self._server)
 | |
| 208 | +            self._bytestream_service = ByteStreamService(self.__grpc_server)
 | |
| 184 | 209 |  | 
| 185 | 210 |          self._bytestream_service.add_instance(instance_name, instance)
 | 
| 211 | + | |
| 212 | +    # --- Public API: Monitoring ---
 | |
| 213 | + | |
| 214 | +    @property
 | |
| 215 | +    def is_monitored(self):
 | |
| 216 | +        return self._is_monitored | 
