From 424283f13805fb7bd848e98503d0d5f0d472a632 Mon Sep 17 00:00:00 2001 From: Sven Rebhan <36194019+srebhan@users.noreply.github.com> Date: Mon, 7 Aug 2023 22:48:47 +0200 Subject: [PATCH] fix(inputs.opcua): Register node IDs again on reconnect (#13682) --- plugins/common/opcua/input/input_client.go | 11 ++++------- plugins/inputs/opcua/read_client.go | 16 ++++++++++------ .../inputs/opcua_listener/subscribe_client.go | 5 +++++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/plugins/common/opcua/input/input_client.go b/plugins/common/opcua/input/input_client.go index 6b2e00753..31501c6c0 100644 --- a/plugins/common/opcua/input/input_client.go +++ b/plugins/common/opcua/input/input_client.go @@ -79,8 +79,7 @@ func (o *InputClientConfig) Validate() error { } func (o *InputClientConfig) CreateInputClient(log telegraf.Logger) (*OpcUAInputClient, error) { - err := o.Validate() - if err != nil { + if err := o.Validate(); err != nil { return nil, err } @@ -97,15 +96,13 @@ func (o *InputClientConfig) CreateInputClient(log telegraf.Logger) (*OpcUAInputC } log.Debug("Initialising node to metric mapping") - err = c.InitNodeMetricMapping() - if err != nil { + if err := c.InitNodeMetricMapping(); err != nil { return nil, err } c.initLastReceivedValues() - err = c.initNodeIDs() - return c, err + return c, nil } // NodeMetricMapping mapping from a single node to a metric @@ -327,7 +324,7 @@ func (o *OpcUAInputClient) InitNodeMetricMapping() error { return nil } -func (o *OpcUAInputClient) initNodeIDs() error { +func (o *OpcUAInputClient) InitNodeIDs() error { o.NodeIDs = make([]*ua.NodeID, 0, len(o.NodeMetricMapping)) for _, node := range o.NodeMetricMapping { nid, err := ua.ParseNodeID(node.Tag.NodeID()) diff --git a/plugins/inputs/opcua/read_client.go b/plugins/inputs/opcua/read_client.go index 4bbb566c3..29986e218 100644 --- a/plugins/inputs/opcua/read_client.go +++ b/plugins/inputs/opcua/read_client.go @@ -52,9 +52,14 @@ func (rc *ReadClientConfig) CreateReadClient(log telegraf.Logger) (*ReadClient, } func (o *ReadClient) Connect() error { - err := o.OpcUAClient.Connect() - if err != nil { - return err + if err := o.OpcUAClient.Connect(); err != nil { + return fmt.Errorf("connect failed: %w", err) + } + + // Make sure we setup the node-ids correctly after reconnect + // as the server might be restarted and IDs changed + if err := o.OpcUAInputClient.InitNodeIDs(); err != nil { + return fmt.Errorf("initializing node IDs failed: %w", err) } readValueIds := make([]*ua.ReadValueID, 0, len(o.NodeIDs)) @@ -67,7 +72,7 @@ func (o *ReadClient) Connect() error { NodesToRegister: o.NodeIDs, }) if err != nil { - return fmt.Errorf("registerNodes failed: %w", err) + return fmt.Errorf("registering nodes failed: %w", err) } for _, v := range regResp.RegisteredNodeIDs { @@ -81,8 +86,7 @@ func (o *ReadClient) Connect() error { NodesToRead: readValueIds, } - err = o.read() - if err != nil { + if err := o.read(); err != nil { return fmt.Errorf("get data failed: %w", err) } diff --git a/plugins/inputs/opcua_listener/subscribe_client.go b/plugins/inputs/opcua_listener/subscribe_client.go index a327b7f13..a42738df2 100644 --- a/plugins/inputs/opcua_listener/subscribe_client.go +++ b/plugins/inputs/opcua_listener/subscribe_client.go @@ -37,6 +37,11 @@ func (sc *SubscribeClientConfig) CreateSubscribeClient(log telegraf.Logger) (*Su if err != nil { return nil, err } + + if err := client.InitNodeIDs(); err != nil { + return nil, err + } + subClient := &SubscribeClient{ OpcUAInputClient: client, Config: *sc,