1
0
Fork 0
telegraf/plugins/inputs/opcua/opcua.go
Daniel Baumann 4978089aab
Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-24 07:26:29 +02:00

81 lines
2 KiB
Go

//go:generate ../../../tools/readme_config_includer/generator
package opcua
import (
_ "embed"
"time"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/plugins/common/opcua"
"github.com/influxdata/telegraf/plugins/common/opcua/input"
"github.com/influxdata/telegraf/plugins/inputs"
)
//go:embed sample.conf
var sampleConfig string
type OpcUA struct {
readClientConfig
Log telegraf.Logger `toml:"-"`
client *readClient
// Add a consecutive error counter to potentially force reconnection
consecutiveErrors uint64
}
func (*OpcUA) SampleConfig() string {
return sampleConfig
}
func (o *OpcUA) Init() (err error) {
o.client, err = o.readClientConfig.createReadClient(o.Log)
return err
}
func (o *OpcUA) Gather(acc telegraf.Accumulator) error {
// Will (re)connect if the client is disconnected
metrics, err := o.client.currentValues()
if err != nil {
o.consecutiveErrors++
// If we've had multiple consecutive errors, force session invalidation
// to ensure the next gather cycle will perform a full reconnection
if o.consecutiveErrors > o.client.ReconnectErrorThreshold {
o.client.forceReconnect = true
}
return err
}
// Reset error counter on success
o.consecutiveErrors = 0
// Parse the resulting data into metrics
for _, m := range metrics {
acc.AddMetric(m)
}
return nil
}
func init() {
inputs.Add("opcua", func() telegraf.Input {
return &OpcUA{
readClientConfig: readClientConfig{
InputClientConfig: input.InputClientConfig{
OpcUAClientConfig: opcua.OpcUAClientConfig{
Endpoint: "opc.tcp://localhost:4840",
SecurityPolicy: "auto",
SecurityMode: "auto",
Certificate: "/etc/telegraf/cert.pem",
PrivateKey: "/etc/telegraf/key.pem",
AuthMethod: "Anonymous",
ConnectTimeout: config.Duration(5 * time.Second),
RequestTimeout: config.Duration(10 * time.Second),
},
MetricName: "opcua",
Timestamp: input.TimestampSourceTelegraf,
},
},
}
})
}