如何通过FluentD for GCE查看在Docker容器内生成的C ++应用程序核心转储

时间:2018-02-19 09:56:52

标签: docker kubernetes fluentd stackdriver google-cloud-stackdriver

我在Kubernetes Cluster中运行了一个c ++应用程序。在GCE StackDriver和fluentd-gcp的帮助下,我能够看到我的应用程序日志。现在,我希望看到代码转储(如果我的应用程序崩溃时生成)通过GCE StackDriver接口。是否有可能使用FluentD实现这一点?如果是,任何推荐的FluentD插件都可以完成这项工作..

谢谢,

1 个答案:

答案 0 :(得分:0)

我最近正在考虑类似的问题-如何获取我无法访问的群集中运行的崩溃c ++应用程序的回溯。

我想到了使用这样的脚本来运行/包装我的应用程序的想法:

#!/bin/bash

function coredumps_monitor
{
    EXECUTABLE=$1
    COREDIR=$2

    while true; do
        sleep 2

        for f in $(find $COREDIR -type f -name 'core*'); do
            sleep 2

            BT=$(gdb -batch -ex 'thread apply all bt' $EXECUTABLE $f)

            jq -nc \
                --arg bt "${BT}" \
                --arg file "${f}" \
                '{event: "coredump", bt: $bt, file: $file}'

            mv $f latest-core
        done
    done
}

coredumps_monitor /my-cpp-server /dir-with-coredumps &

exec /my-cpp-server

安装'gdb-minimal'和'jq'软件包是必要的,在我看来,这只是额外的8 MB。

您可以看到,这个想法是运行一个进程(与我的应用程序一起),该进程定期检查任何coredum。对于找到的coredump,它使用'gdb'获取回溯,并以'jq'工具创建的json格式将其打印到stdout。

我们的服务器具有分叉模型,因此服务器本身以及容器崩溃的可能性很小。但是,如果仍然发生这种情况,则可以将coredumps存储在一个卷中,并在重新创建容器时打印回溯记录。

也许有更好的解决方案,但到目前为止我还没有遇到。另外请注意,我对clound还不熟悉:),我们不使用GCE。