def log_client(client): """Safely log client creation at INFO level.""" if not client.is_enabled(): # raven already logs a *disabled* client at INFO level return # base_url shouldn't have secrets in, but just in case, clean it public_dsn = client.remote.get_public_dsn() scheme = parse_url(client.remote.base_url).scheme url = scheme + ':' + public_dsn clean_url = sanitize_url(url) msg = 'configured raven DSN' extra = {'dsn': clean_url} config = talisker.get_config() env_cfg = config.raw.get('SENTRY_DSN') if env_cfg: # make a full url look like a public dsn clean_env = sanitize_url(re.sub(r'://(.*):.*@', r'://\1@', env_cfg)) if clean_env == clean_url: msg += ' from SENTRY_DSN config' extra['from_env'] = True else: msg += ' overriding SENTRY_DSN config' extra['SENTRY_DSN'] = clean_env logging.getLogger(__name__).info(msg, extra=extra)
def collect_metadata(request, response): metadata = collections.OrderedDict() parsed = parse_url(request.url) hostname = get_endpoint_name(request.url) if hostname is None: address = parsed.netloc hostname = parsed.hostname else: address = hostname if parsed.port: address += ':{}'.format(parsed.port) # do not include querystring in url, as may have senstive info metadata['url'] = '{}://{}{}'.format(parsed.scheme, address, parsed.path) if parsed.query: metadata['url'] += '?' redacted = ('{}=<len {}>'.format(k, len(v)) for k, v in parse_qsl(parsed.query)) metadata['qs'] = '?' + '&'.join(redacted) metadata['qs_size'] = len(parsed.query) metadata['method'] = request.method metadata['host'] = hostname if parsed.netloc not in metadata['url']: metadata['netloc'] = parsed.netloc if response is not None: metadata['status_code'] = response.status_code if 'X-View-Name' in response.headers: metadata['view'] = response.headers['X-View-Name'] if 'Server' in response.headers: metadata['server'] = response.headers['Server'] duration = response.elapsed.total_seconds() * 1000 metadata['duration_ms'] = round(duration, 3) request_type = request.headers.get('content-type', None) if request_type is not None: metadata['request_type'] = request_type if metadata['method'] in ('POST', 'PUT', 'PATCH'): try: metadata['request_size'] = int( request.headers.get('content-length', 0)) except ValueError: pass if response is not None: response_type = response.headers.get('content-type', None) if response_type is not None: metadata['response_type'] = response_type try: metadata['response_size'] = int( response.headers.get('content-length', 0)) except ValueError: pass return metadata
def log_client(client, from_env=False): """Safely log client creation at INFO level.""" if not client.is_enabled(): # raven already logs a *disabled* client at INFO level return # base_url shouldn't have secrets in, but just in case, clean it public_dsn = client.remote.get_public_dsn() scheme = parse_url(client.remote.base_url).scheme url = scheme + ':' + public_dsn clean_url = sanitize_url(url) msg = 'configured raven' extra = {'dsn': clean_url} if from_env: msg += ' from SENTRY_DSN environment' extra['from_env'] = True logging.getLogger(__name__).info(msg, extra=extra)
def get_endpoint_name(endpoint): parsed = parse_url(endpoint) return HOSTS.get(parsed.netloc)
def register_endpoint_name(endpoint, name): """Register a human friendly name for an IP:PORT address for metrics.""" parsed = parse_url(endpoint) HOSTS[parsed.netloc] = name