Программа загрузки ошибки отладчика Go Stackdriver

#kubernetes #google-kubernetes-engine #stackdriver #google-cloud-stackdriver

#kubernetes #google-kubernetes-engine #stackdriver #google-облако-stackdriver

Вопрос:

Я пытаюсь настроить отладку Stackdriver с помощью Go. Используя статью и этот замечательный средний пост, я придумал это решение.

Ключевые части, в cloudbuild.yaml

 - name: gcr.io/cloud-builders/wget
  args: [
    "-O",
    "go-cloud-debug",
    "https://storage.googleapis.com/cloud-debugger/compute-go/go-cloud-debug"
  ]

...
  

У меня есть файл Dockerfile

 ...

COPY gopath/bin/stackdriver-demo /stackdriver-demo

ADD go-cloud-debug /
ADD source-context.json /

CMD ["/go-cloud-debug","-sourcecontext=./source-context.json", "-appmodule=go-errrep","-appversion=1.0","--","/stackdriver-demo"]

...

  

Однако модули продолжают сбоить, в журналах контейнеров отображается эта ошибка:

 Error loading program: decoding dwarf section info at offset 0x0: too short
  

РЕДАКТИРОВАТЬ: Использование https://storage.googleapis.com/cloud-debugger/compute-go/go-cloud-debug может быть устаревшим, поскольку я не видел, чтобы оно использовалось за пределами сообщения Daz medium. В официальных документах используется пакет cloud.google.com/go/cmd/go-cloud-debug-agent

У меня есть обновление cloudbuild.yaml-файл для установки этого пакета:

 - name: 'gcr.io/cloud-builders/go'
  args: ["get", "-u", "cloud.google.com/go/cmd/go-cloud-debug-agent"]
  env: ['PROJECT_ROOT=github.com/roberson34/stackdriver-demo', 'CGO_ENABLED=0', 'GOOS=linux']

- name: 'gcr.io/cloud-builders/go'
  args: ["install", "cloud.google.com/go/cmd/go-cloud-debug-agent"]
  env: ['PROJECT_ROOT=github.com/roberson34/stackdriver-demo', 'CGO_ENABLED=0', 'GOOS=linux']
  

И в Dockerfile я могу получить доступ к двоичному файлу в gopath/bin/go-cloud-debug-agent

Когда я выполняю gopath/bin/go-cloud-debug-agent с моей собственной программой в качестве аргумента:

/go-cloud-debug-agent -sourcecontext=./source-context.json -appmodule=go-errrep -appversion=1.0 -- /stackdriver-demo

Я получаю еще одну непрозрачную ошибку:

 Error loading program: AttrStmtList not present or not int64 for unit 88
  

Таким образом, в основном использование cloud-debug двоичного файла из https://storage.googleapis.com/cloud-debugger/compute-go/go-cloud-debug и cloud-debug-agent двоичного файла из пакета cloud.google.com/go/cmd/go-cloud-debug-agent не работает и выдает разные ошибки.

Был бы признателен за любые советы о том, что я делаю неправильно и как это исправить.

Комментарии:

1. Ах, лесть 😉 Спасибо за любезные комментарии. Позвольте мне взглянуть на это и посмотреть, смогу ли я все еще заставить это работать.

Ответ №1:

ОК 🙂

Да, вы должны следовать текущей документации Stackdriver, например go-cloud-debug-agent

К сожалению, в настоящее время существуют различные проблемы с моим сообщением, включая (в настоящее время неработающий) gcr.io/cloud-builders/kubectl для регионов.

Я думаю, что ваша проблема связана с вашим использованием golang:alpine . Alpine использует musl, а не glibc, который вы найдете в большинстве других дистрибутивов Linux, и поэтому вам действительно необходимо скомпилировать для Alpine, чтобы убедиться, что ваши двоичные файлы ссылаются на правильный libc.

Я могу заставить ваше решение работать в первую очередь, переключив ваш Dockerfile на использование агента облачной отладки в Alpine и скомпилировав ваш исходный код в Alpine:

 FROM golang:alpine

RUN apk add git
RUN go get -u cloud.google.com/go/cmd/go-cloud-debug-agent

ADD main.go src
RUN CGO_ENABLED=0 go build -gcflags=all='-N -l' src/main.go

ADD source-context.json /

CMD ["bin/go-cloud-debug-agent","-sourcecontext=/source-context.json", "-appmodule=stackdriver-demo","-appversion=1.0","--","main"]

  

Я думаю, что это должно вывести вас за рамки ошибок, которые вы задокументировали, и вы сможете развернуть свой контейнер в Kubernetes.

Я сделал свою версию вашего изображения общедоступной (и сохраню ее для вас на несколько дней):

 gcr.io/dazwilkin-190402-55473323/roberson34@sha256:17cb45f1320e2fe04e0681310506f4c229896429192b0d1c2c8dc20ed54adb0d
  

Возможно, вы захотите сослаться на нее (с помощью этого дайджеста) в своем deployment.yaml

ПРИМЕЧАНИЕ Для того, чтобы отчеты об ошибках были «интересными», ваш код должен генерировать ошибки, и в вашем примере это будет непросто (обычно это хорошо). Вы можете рассмотреть возможность добавления другого обработчика ошибок, который всегда приводит к ошибкам, чтобы вы могли протестировать службу.