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)
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
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)
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)
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)
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 )