Django, Apache2 в Google Kubernetes Engine, записывающий трассировки Opencensus в трассировку Stackdriver - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть веб-приложение 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, а не бинарных файлов внешней операционной системы, о которых я знаю.Любые другие идеи будут с благодарностью!

...