У меня есть веб-приложение Django от Apache2 с mod_wsgi в док-контейнерах, запущенных на кластере Kubernetes в Google Cloud Platform, защищенном Identity-Aware Proxy.Все работает отлично, но я хочу отправлять трассировки GCP Stackdriver для всех запросов без записи по одному для каждого представления в моем проекте.Я нашел промежуточное программное обеспечение для этого, используя Opencensus.Я просмотрел эту документацию и смог вручную создать трассы, которые экспортировались в Stackdriver Trace в моем проекте, указав StackdriverExporter
и передав параметр project_id
в качестве облачной платформы Google Project Number
для моегоproject.
Теперь, чтобы сделать это автоматическим для ВСЕХ запросов, я следовал инструкциям по настройке промежуточного программного обеспечения.В settings.py я добавил модуль в INSTALLED_APPS
, MIDDLEWARE
и настроил словарь опций OPENCENSUS_TRACE
.Я также добавил OPENCENSUS_TRACE_PARAMS
.Это прекрасно работает с экспортером по умолчанию «opencensus.trace.exporters.print_exporter.PrintExporter», так как я вижу информацию о трассировке и интервале, включая идентификатор трассировки и все подробности в журналах моего веб-сервера Apache2.Однако я хочу отправить их на мой процессор Stackdriver Trace для анализа.
Я попытался установить для параметра EXPORTER
значение opencensus.trace.exporters.stackdriver_exporter.StackdriverExporter
, которое работает при запуске вручную из оболочки, если вы предоставляете проектномер.
Когда он настроен на использование StackdriverExporter
, веб-страница не отвечает на загрузку, проверка работоспособности начинает завершаться неудачно, и в конечном итоге веб-страница возвращается с ошибкой 502, заявляя, что я должен попробоватьснова через 30 секунд (я полагаю, что Identity-Aware Proxy генерирует эту ошибку, как только обнаруживает неудавшуюся проверку работоспособности), но сервер не генерирует ошибок, и нет журналов доступа или ошибок для Apache2.
В файле settings.py есть еще один словарь с именем OPENCENSUS_TRACE_PARAMS
, который, как я полагаю, необходим для определения номера проекта, который должен использовать экспортер.В примере GCP_EXPORTER_PROJECT
установлен как None
, а SERVICE_NAME
установлен как 'my_service'
.
Какие параметры мне нужно установить, чтобы экспортер отправлял обратно в Stackdriver вместо печати в журналы?Есть ли у вас какие-либо идеи о том, как я могу это настроить?
settings.py
MIDDLEWARE = (
...
'opencensus.trace.ext.django.middleware.OpencensusMiddleware',
)
INSTALLED_APPS = (
...
'opencensus.trace.ext.django',
)
OPENCENSUS_TRACE = {
'SAMPLER': 'opencensus.trace.samplers.probability.ProbabilitySampler',
'EXPORTER': 'opencensus.trace.exporters.stackdriver_exporter.StackdriverExporter', # This one just makes the server hang with no response or error and kills the health check.
'PROPAGATOR': 'opencensus.trace.propagation.google_cloud_format.GoogleCloudFormatPropagator',
# 'EXPORTER': 'opencensus.trace.exporters.print_exporter.PrintExporter', # This one works to print the Trace and Span with IDs and details in the logs.
}
OPENCENSUS_TRACE_PARAMS = {
'BLACKLIST_PATHS': ['/health'],
'GCP_EXPORTER_PROJECT': 'my_project_number', # Should this be None like the example, or Project ID, or Project Number?
'SAMPLING_RATE': 0.5,
'SERVICE_NAME': 'my_service', # Not sure if this is my app name or some other service name.
'ZIPKIN_EXPORTER_HOST_NAME': 'localhost', # Are the following even necessary, or are they causing a failure that is not detected by Apache2?
'ZIPKIN_EXPORTER_PORT': 9411,
'ZIPKIN_EXPORTER_PROTOCOL': 'http',
'JAEGER_EXPORTER_HOST_NAME': None,
'JAEGER_EXPORTER_PORT': None,
'JAEGER_EXPORTER_AGENT_HOST_NAME': 'localhost',
'JAEGER_EXPORTER_AGENT_PORT': 6831
}
Вот пример (я предварительно настроил формат для удобства чтения) журнала Apache2, когда он установлениспользовать PrintExporter
:
[Fri Feb 08 09:00:32.427575 2019]
[wsgi:error]
[pid 1097:tid 139801302882048]
[client 10.48.0.1:43988]
[SpanData(
name='services.views.my_view',
context=SpanContext(
trace_id=e882f23e49e34fc09df621867d753532,
span_id=None,
trace_options=TraceOptions(enabled=True),
tracestate=None
),
span_id='bcbe7b96906a482a',
parent_span_id=None,
attributes={
'http.status_code': '200',
'http.method': 'GET',
'http.url': '/',
'django.user.name': ''
},
start_time='2019-02-08T17:00:29.845733Z',
end_time='2019-02-08T17:00:32.427455Z',
child_span_count=0,
stack_trace=None,
time_events=[],
links=[],
status=None,
same_process_as_parent_span=None,
span_kind=1
)]
Заранее благодарим за любые советы, помощь или советы по устранению неполадок!
Редактировать 2019-02-08 18:56 UTC:
Я нашел это в промежуточном программном обеспечении:
# Initialize the exporter
transport = convert_to_import(settings.params.get(TRANSPORT))
if self._exporter.__name__ == 'GoogleCloudExporter':
_project_id = settings.params.get(GCP_EXPORTER_PROJECT, None)
self.exporter = self._exporter(
project_id=_project_id,
transport=transport)
elif self._exporter.__name__ == 'ZipkinExporter':
_service_name = self._get_service_name(settings.params)
_zipkin_host_name = settings.params.get(
ZIPKIN_EXPORTER_HOST_NAME, 'localhost')
_zipkin_port = settings.params.get(
ZIPKIN_EXPORTER_PORT, 9411)
_zipkin_protocol = settings.params.get(
ZIPKIN_EXPORTER_PROTOCOL, 'http')
self.exporter = self._exporter(
service_name=_service_name,
host_name=_zipkin_host_name,
port=_zipkin_port,
protocol=_zipkin_protocol,
transport=transport)
elif self._exporter.__name__ == 'TraceExporter':
_service_name = self._get_service_name(settings.params)
_endpoint = settings.params.get(
OCAGENT_TRACE_EXPORTER_ENDPOINT, None)
self.exporter = self._exporter(
service_name=_service_name,
endpoint=_endpoint,
transport=transport)
elif self._exporter.__name__ == 'JaegerExporter':
_service_name = self._get_service_name(settings.params)
self.exporter = self._exporter(
service_name=_service_name,
transport=transport)
else:
self.exporter = self._exporter(transport=transport)
Экспортер теперь называется StackdriverExporter
вместо GoogleCloudExporter
.Я установил в своем приложении класс с именем GoogleCloudExporter
, который наследует StackdriverExporter
, и обновил свой файл settings.py для использования GoogleCloudExporter
, но он, похоже, не работает, интересно, есть ли другой код, ссылающийся на эти старые именасхемы, возможно для транспорта.Я ищу в исходном коде подсказки ... Это, по крайней мере, говорит мне, что я могу избавиться от параметров параметров ZIPKIN и JAEGER, как это определено в параметре EXPORTER
.
Редактировать2019-02-08 23:58 UTC:
Я удалил Apache2, чтобы изолировать проблему, и просто настроил свой образ докера для использования встроенного веб-сервера Django CMD ["python", "/path/to/manage.py", "runserver", "0.0.0.0:80"]
, и он работает!Когда я захожу на сайт, он записывает трассировки в Stackdriver Trace для каждого запроса, имя Span - это выполняемый модуль и метод.
Каким-то образом Apache2 не разрешено отправлять их, но я могу сделать это изоболочка при запуске от имени root.Я добавляю в вопрос теги Apache2 и mod-wsgi, потому что у меня странное ощущение, что это связано с разветвлением дочерних процессов в Apache2 и mod-WSGI.Возможно ли, что дочерний процесс не может быть создан, поскольку дочерний процесс apache2 помещен в «песочницу», или это может быть проблема с разрешениями?Это кажется странным, потому что это просто вызов модулей python, а не бинарных файлов внешней операционной системы, о которых я знаю.Любые другие идеи будут с благодарностью!