pkg/profiling/continuous/checker/common/checker.go (51 lines of code) (raw):

// Licensed to Apache Software Foundation (ASF) under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Apache Software Foundation (ASF) licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package common import ( "github.com/apache/skywalking-rover/pkg/logger" "github.com/apache/skywalking-rover/pkg/process/api" "github.com/apache/skywalking-rover/pkg/profiling/continuous/base" "reflect" ) var log = logger.GetLogger("profiling", "continuous", "checker", "common") type ProcessInfo interface { } type numbers interface { int | int32 | int64 | float64 } // BaseChecker contains the process with them self info // Key: process pid // Value: the process information, usually contains the time windows and policy items type BaseChecker[Info ProcessInfo] struct { InfoGenerator func(p api.ProcessInterface, older Info, items []*base.PolicyItem) Info PidWithInfos map[int32]Info } func NewBaseChecker[Info ProcessInfo](generator func(p api.ProcessInterface, older Info, items []*base.PolicyItem) Info) *BaseChecker[Info] { return &BaseChecker[Info]{ InfoGenerator: generator, PidWithInfos: make(map[int32]Info), } } func (c *BaseChecker[Info]) SyncPolicies(policies []*base.SyncPolicyWithProcesses, getEnabledItem func(items map[base.CheckType]*base.PolicyItem) *base.PolicyItem, notify func(key int32, isDelete bool)) { pidWithPolicyItems := make(map[api.ProcessInterface][]*base.PolicyItem) for _, processWithPolicies := range policies { item := getEnabledItem(processWithPolicies.Policy.Items) if item == nil { continue } // create or get the existing windows // and add the policy into the update for _, p := range processWithPolicies.Processes { pidWithPolicyItems[p] = append(pidWithPolicyItems[p], item) } } // generate the new process info result := make(map[int32]Info) for p, items := range pidWithPolicyItems { pid := p.Pid() if existing := c.PidWithInfos[pid]; reflect.ValueOf(existing).IsZero() && notify != nil { notify(pid, false) } result[pid] = c.InfoGenerator(p, c.PidWithInfos[pid], items) } // if the pid is not exist in the new policies, then notify to delete for key := range c.PidWithInfos { if newResult := result[key]; reflect.ValueOf(newResult).IsZero() && notify != nil { notify(key, true) } } c.PidWithInfos = result }