github.com/netdata/go.d.plugin@v0.58.1/agent/functions/function.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package functions
     4  
     5  import (
     6  	"bufio"
     7  	"bytes"
     8  	"encoding/csv"
     9  	"fmt"
    10  	"strconv"
    11  	"strings"
    12  	"time"
    13  )
    14  
    15  type Function struct {
    16  	key     string
    17  	UID     string
    18  	Timeout time.Duration
    19  	Name    string
    20  	Args    []string
    21  	Payload []byte
    22  }
    23  
    24  func (f *Function) String() string {
    25  	return fmt.Sprintf("key: %s, uid: %s, timeout: %s, function: %s, args: %v, payload: %s",
    26  		f.key, f.UID, f.Timeout, f.Name, f.Args, string(f.Payload))
    27  }
    28  
    29  func parseFunction(s string) (*Function, error) {
    30  	r := csv.NewReader(strings.NewReader(s))
    31  	r.Comma = ' '
    32  
    33  	parts, err := r.Read()
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  	if len(parts) != 4 {
    38  		return nil, fmt.Errorf("unexpected number of words: want 4, got %d (%v)", len(parts), parts)
    39  	}
    40  
    41  	timeout, err := strconv.ParseInt(parts[2], 10, 64)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	cmd := strings.Split(parts[3], " ")
    47  
    48  	fn := &Function{
    49  		key:     parts[0],
    50  		UID:     parts[1],
    51  		Timeout: time.Duration(timeout) * time.Second,
    52  		Name:    cmd[0],
    53  		Args:    cmd[1:],
    54  	}
    55  
    56  	return fn, nil
    57  }
    58  
    59  func parseFunctionWithPayload(s string, sc *bufio.Scanner) (*Function, error) {
    60  	fn, err := parseFunction(s)
    61  	if err != nil {
    62  		return nil, err
    63  	}
    64  
    65  	var n int
    66  	var buf bytes.Buffer
    67  	for sc.Scan() && sc.Text() != "FUNCTION_PAYLOAD_END" {
    68  		if n++; n > 1 {
    69  			buf.WriteString("\n")
    70  		}
    71  		buf.WriteString(sc.Text())
    72  	}
    73  
    74  	fn.Payload = append(fn.Payload, buf.Bytes()...)
    75  
    76  	return fn, nil
    77  }