美文网首页
containerd如何监控容器oom,重启次数

containerd如何监控容器oom,重启次数

作者: wwq2020 | 来源:发表于2023-12-30 10:36 被阅读0次

    demo

    func handle(e interface{}) error {
        switch ev := e.(type) {
        case *events.TaskOOM:
            ...
            }
    }
    
    func main(){
        client, err := containerd.New(defaults.DefaultAddress)
        if err != nil {
            panic(err)
        }
        ctx := namespaces.WithNamespace(context.TODO(), "k8s.io")
    
        evts, errs := client.EventService().Subscribe(ctx)
        for {
            select {
            case err = <-errs:
                panic(err)
            case evt := <-evts:
                if evt.Event != nil {
                    v, err := typeurl.UnmarshalAny(evt.Event)
                    if err != nil {
                        panic(err)
                    }
    
                    handle(v)
                }
            }
        }
    }
    

    相关源码

    依赖于containerd的events service

    services/events/service.go中

    func (s *service) Subscribe(req *api.SubscribeRequest, srv api.Events_SubscribeServer) error {
    ...
        eventq, errq := s.events.Subscribe(ctx, req.Filters...)
    ...
    }
    

    events/exchange/exchange.go中

    func (e *Exchange) Subscribe(ctx context.Context, fs ...string) (ch <-chan *events.Envelope, errs <-chan error) {
    ...
        go func() {
            defer closeAll()
    
            var err error
        loop:
            for {
                select {
                case ev := <-channel.C:
                    env, ok := ev.(*events.Envelope)
                    if !ok {
                        // TODO(stevvooe): For the most part, we are well protected
                        // from this condition. Both Forward and Publish protect
                        // from this.
                        err = fmt.Errorf("invalid envelope encountered %#v; please file a bug", ev)
                        break
                    }
    
                    select {
                    case evch <- env:
                    case <-ctx.Done():
                        break loop
                    }
                case <-ctx.Done():
                    break loop
                }
            }
    
            if err == nil {
                if cerr := ctx.Err(); cerr != context.Canceled {
                    err = cerr
                }
            }
    
            errq <- err
        }()
    ...
    }
    

    runtime/events.go中

    topic有如下
    const (
        // TaskCreateEventTopic for task create
        TaskCreateEventTopic = "/tasks/create"
        // TaskStartEventTopic for task start
        TaskStartEventTopic = "/tasks/start"
        // TaskOOMEventTopic for task oom
        TaskOOMEventTopic = "/tasks/oom"
        // TaskExitEventTopic for task exit
        TaskExitEventTopic = "/tasks/exit"
        // TaskDeleteEventTopic for task delete
        TaskDeleteEventTopic = "/tasks/delete"
        // TaskExecAddedEventTopic for task exec create
        TaskExecAddedEventTopic = "/tasks/exec-added"
        // TaskExecStartedEventTopic for task exec start
        TaskExecStartedEventTopic = "/tasks/exec-started"
        // TaskPausedEventTopic for task pause
        TaskPausedEventTopic = "/tasks/paused"
        // TaskResumedEventTopic for task resume
        TaskResumedEventTopic = "/tasks/resumed"
        // TaskCheckpointedEventTopic for task checkpoint
        TaskCheckpointedEventTopic = "/tasks/checkpointed"
        // TaskUnknownTopic for unknown task events
        TaskUnknownTopic = "/tasks/?"
    )
    
    topic对应结构
    func GetTopic(e interface{}) string {
        switch e.(type) {
        case *events.TaskCreate:
            return TaskCreateEventTopic
        case *events.TaskStart:
            return TaskStartEventTopic
        case *events.TaskOOM:
            return TaskOOMEventTopic
        case *events.TaskExit:
            return TaskExitEventTopic
        case *events.TaskDelete:
            return TaskDeleteEventTopic
        case *events.TaskExecAdded:
            return TaskExecAddedEventTopic
        case *events.TaskExecStarted:
            return TaskExecStartedEventTopic
        case *events.TaskPaused:
            return TaskPausedEventTopic
        case *events.TaskResumed:
            return TaskResumedEventTopic
        case *events.TaskCheckpointed:
            return TaskCheckpointedEventTopic
        default:
            log.L.Warnf("no topic for type %#v", e)
        }
        return TaskUnknownTopic
    }
    

    开源实现

    https://github.com/draganm/missing-container-metrics

    相关文章

      网友评论

          本文标题:containerd如何监控容器oom,重启次数

          本文链接:https://www.haomeiwen.com/subject/cbosndtx.html