Пример #1
0
    def test_registered_type(self):
        from google.protobuf import any_pb2
        from google.protobuf import descriptor_pool
        from google.protobuf.struct_pb2 import Struct
        from google.protobuf.struct_pb2 import Value

        pool = descriptor_pool.Default()
        type_name = "google.protobuf.Struct"
        # Make sure the descriptor is known in the registry.
        descriptor = pool.FindMessageTypeByName(type_name)
        self.assertEqual(descriptor.name, "Struct")

        type_url = "type.googleapis.com/" + type_name
        field_name = "foo"
        field_value = "Bar"
        struct_pb = Struct(
            fields={field_name: Value(string_value=field_value)})
        any_pb = any_pb2.Any(type_url=type_url,
                             value=struct_pb.SerializeToString())

        entry_pb = LogEntryPB(proto_payload=any_pb, log_name="all-good")
        result = self._call_fut(LogEntryPB.pb(entry_pb))
        expected_proto = {
            "logName": entry_pb.log_name,
            "protoPayload": {
                "@type": type_url,
                "value": {
                    field_name: field_value
                }
            },
        }
        self.assertEqual(result, expected_proto)
Пример #2
0
 def test_simple(self):
     entry_pb = LogEntryPB(log_name="lol-jk", text_payload="bah humbug")
     result = self._call_fut(LogEntryPB.pb(entry_pb))
     expected = {
         "logName": entry_pb.log_name,
         "textPayload": entry_pb.text_payload
     }
     self.assertEqual(result, expected)
 def create_logs():
     entries = []
     for i in range(5):
         e = LogEntry(insert_id=f'entry_{i}',
                      json_payload=ParseDict(
                          {
                              'method': 'method',
                              'message': f'message_{i}'
                          }, Struct()))
         entries.append(e)
     return entries
Пример #4
0
def _log_entry_mapping_to_pb(mapping):
    """Helper for :meth:`write_entries`, et aliae

    Performs "impedance matching" between the protobuf attrs and
    the keys expected in the JSON API.
    """
    entry_pb = LogEntryPB.pb(LogEntryPB())
    # NOTE: We assume ``mapping`` was created in ``Batch.commit``
    #       or ``Logger._make_entry_resource``. In either case, if
    #       the ``protoPayload`` key is present, we assume that the
    #       type URL is registered with ``google.protobuf`` and will
    #       not cause any issues in the JSON->protobuf conversion
    #       of the corresponding ``proto_payload`` in the log entry
    #       (it is an ``Any`` field).
    ParseDict(mapping, entry_pb)
    return LogEntryPB(entry_pb)
Пример #5
0
    def test_unregistered_type(self):
        from google.protobuf import any_pb2
        from google.protobuf import descriptor_pool
        from google.protobuf.timestamp_pb2 import Timestamp

        pool = descriptor_pool.Default()
        type_name = "google.bigtable.admin.v2.UpdateClusterMetadata"
        # Make sure the descriptor is not known in the registry.
        with self.assertRaises(KeyError):
            pool.FindMessageTypeByName(type_name)

        type_url = "type.googleapis.com/" + type_name
        metadata_bytes = b"\n\n\n\x03foo\x12\x03bar\x12\x06\x08\xbd\xb6\xfb\xc6\x05"
        any_pb = any_pb2.Any(type_url=type_url, value=metadata_bytes)
        timestamp = Timestamp(seconds=61, nanos=1234000)

        entry_pb = LogEntryPB(proto_payload=any_pb, timestamp=timestamp)
        result = self._call_fut(LogEntryPB.pb(entry_pb))
        self.assertEqual(len(result), 2)
        self.assertEqual(result["timestamp"], "1970-01-01T00:01:01.001234Z")
        # NOTE: This "hack" is needed on Windows, where the equality check
        #       for an ``Any`` instance fails on unregistered types.
        self.assertEqual(result["protoPayload"].type_url, type_url)
        self.assertEqual(result["protoPayload"].value, metadata_bytes)
Пример #6
0
 def log_entries_pager(page_iter):
     for page in page_iter:
         log_entry_dict = _parse_log_entry(LogEntryPB.pb(page))
         yield entry_from_resource(log_entry_dict,
                                   self._client,
                                   loggers=loggers)
Пример #7
0
def log_stats(environment):
    """
    Logs current test stats to Cloud Logging.
    
    This function is executed as a greenlet.
    """

    global test_id
    test_id = None

    logging.info('Entering the Cloud Logging logger greenlet')

    creds, project_id = google.auth.default()
    client = LoggingServiceV2Client(credentials=creds)
    project_path = client.project_path(project_id)

    while True:
        gevent.sleep(LOG_STATS_INTERVAL_SEC)

        if not environment.runner.state in [STATE_RUNNING] or not test_id:
            continue

        log_path = client.log_path(project_id, LOG_NAME)
        timestamp = Timestamp()
        timestamp.FromDatetime(datetime.now())
        log_entries = []
        for key in sorted(environment.stats.entries.keys()):

            r = environment.stats.entries[key]
            payload = Struct()
            payload.update({
                'test_id':
                test_id,
                'signature':
                r.name,
                'model':
                r.method,
                'latency':
                r.get_current_response_time_percentile(0.95),
                'user_count':
                environment.runner.user_count,
                'num_requests':
                environment.runner.stats.total.num_requests,
                'num_failures':
                environment.runner.stats.total.num_failures,
            })

            log_entry = LogEntry(log_name=log_path,
                                 resource={'type': 'global'},
                                 timestamp=timestamp,
                                 json_payload=payload)
            log_entries.append(log_entry)

        if log_entries:
            try:
                response = client.write_log_entries(entries=log_entries)
            except GoogleAPICallError as e:
                logging.error('GoogleAPICallError: %s', e.message)
            except RetryError:
                logging.error('RetryError')
            except:
                logging.error('Unknow exception')
def _create_list_log_entries_response_mock(messages, token):
    return ListLogEntriesResponse(
        entries=[LogEntry(json_payload={"message": message}) for message in messages], next_page_token=token
    )