feat: Allow user to select the source for the metric timestamp. (#9013)
This commit is contained in:
parent
3b94269f30
commit
c4d2ad85f0
|
|
@ -46,6 +46,12 @@ Plugin minimum tested version: 1.16
|
||||||
## Password. Required for auth_method = "UserName"
|
## Password. Required for auth_method = "UserName"
|
||||||
# password = ""
|
# password = ""
|
||||||
#
|
#
|
||||||
|
## Option to select the metric timestamp to use. Valid options are:
|
||||||
|
## "gather" -- uses the time of receiving the data in telegraf
|
||||||
|
## "server" -- uses the timestamp provided by the server
|
||||||
|
## "source" -- uses the timestamp provided by the source
|
||||||
|
# timestamp = "gather"
|
||||||
|
#
|
||||||
## Node ID configuration
|
## Node ID configuration
|
||||||
## name - field name to use in the output
|
## name - field name to use in the output
|
||||||
## namespace - OPC UA namespace of the node (integer value 0 thru 3)
|
## namespace - OPC UA namespace of the node (integer value 0 thru 3)
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/gopcua/opcua/ua"
|
"github.com/gopcua/opcua/ua"
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/config"
|
"github.com/influxdata/telegraf/config"
|
||||||
|
"github.com/influxdata/telegraf/internal/choice"
|
||||||
"github.com/influxdata/telegraf/plugins/inputs"
|
"github.com/influxdata/telegraf/plugins/inputs"
|
||||||
"github.com/influxdata/telegraf/selfstat"
|
"github.com/influxdata/telegraf/selfstat"
|
||||||
)
|
)
|
||||||
|
|
@ -26,6 +27,7 @@ type OpcUA struct {
|
||||||
PrivateKey string `toml:"private_key"`
|
PrivateKey string `toml:"private_key"`
|
||||||
Username string `toml:"username"`
|
Username string `toml:"username"`
|
||||||
Password string `toml:"password"`
|
Password string `toml:"password"`
|
||||||
|
Timestamp string `toml:"timestamp"`
|
||||||
AuthMethod string `toml:"auth_method"`
|
AuthMethod string `toml:"auth_method"`
|
||||||
ConnectTimeout config.Duration `toml:"connect_timeout"`
|
ConnectTimeout config.Duration `toml:"connect_timeout"`
|
||||||
RequestTimeout config.Duration `toml:"request_timeout"`
|
RequestTimeout config.Duration `toml:"request_timeout"`
|
||||||
|
|
@ -77,12 +79,12 @@ type GroupSettings struct {
|
||||||
|
|
||||||
// OPCData type
|
// OPCData type
|
||||||
type OPCData struct {
|
type OPCData struct {
|
||||||
TagName string
|
TagName string
|
||||||
Value interface{}
|
Value interface{}
|
||||||
Quality ua.StatusCode
|
Quality ua.StatusCode
|
||||||
TimeStamp string
|
ServerTime time.Time
|
||||||
Time string
|
SourceTime time.Time
|
||||||
DataType ua.TypeID
|
DataType ua.TypeID
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConnectionState used for constants
|
// ConnectionState used for constants
|
||||||
|
|
@ -136,6 +138,12 @@ const sampleConfig = `
|
||||||
## Password. Required for auth_method = "UserName"
|
## Password. Required for auth_method = "UserName"
|
||||||
# password = ""
|
# password = ""
|
||||||
#
|
#
|
||||||
|
## Option to select the metric timestamp to use. Valid options are:
|
||||||
|
## "gather" -- uses the time of receiving the data in telegraf
|
||||||
|
## "server" -- uses the timestamp provided by the server
|
||||||
|
## "source" -- uses the timestamp provided by the source
|
||||||
|
# timestamp = "gather"
|
||||||
|
#
|
||||||
## Node ID configuration
|
## Node ID configuration
|
||||||
## name - field name to use in the output
|
## name - field name to use in the output
|
||||||
## namespace - OPC UA namespace of the node (integer value 0 thru 3)
|
## namespace - OPC UA namespace of the node (integer value 0 thru 3)
|
||||||
|
|
@ -188,7 +196,12 @@ func (o *OpcUA) SampleConfig() string {
|
||||||
func (o *OpcUA) Init() error {
|
func (o *OpcUA) Init() error {
|
||||||
o.state = Disconnected
|
o.state = Disconnected
|
||||||
|
|
||||||
err := o.validateEndpoint()
|
err := choice.Check(o.Timestamp, []string{"", "gather", "server", "source"})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = o.validateEndpoint()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -485,8 +498,9 @@ func (o *OpcUA) getData() error {
|
||||||
o.nodeData[i].Value = d.Value.Value()
|
o.nodeData[i].Value = d.Value.Value()
|
||||||
o.nodeData[i].DataType = d.Value.Type()
|
o.nodeData[i].DataType = d.Value.Type()
|
||||||
}
|
}
|
||||||
o.nodeData[i].TimeStamp = d.ServerTimestamp.String()
|
o.nodeData[i].Quality = d.Status
|
||||||
o.nodeData[i].Time = d.SourceTimestamp.String()
|
o.nodeData[i].ServerTime = d.ServerTimestamp
|
||||||
|
o.nodeData[i].SourceTime = d.SourceTimestamp
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -551,6 +565,15 @@ func (o *OpcUA) Gather(acc telegraf.Accumulator) error {
|
||||||
fields[o.nodeData[i].TagName] = o.nodeData[i].Value
|
fields[o.nodeData[i].TagName] = o.nodeData[i].Value
|
||||||
fields["Quality"] = strings.TrimSpace(fmt.Sprint(o.nodeData[i].Quality))
|
fields["Quality"] = strings.TrimSpace(fmt.Sprint(o.nodeData[i].Quality))
|
||||||
acc.AddFields(n.metricName, fields, tags)
|
acc.AddFields(n.metricName, fields, tags)
|
||||||
|
|
||||||
|
switch o.Timestamp {
|
||||||
|
case "server":
|
||||||
|
acc.AddFields(n.metricName, fields, tags, o.nodeData[i].ServerTime)
|
||||||
|
case "source":
|
||||||
|
acc.AddFields(n.metricName, fields, tags, o.nodeData[i].SourceTime)
|
||||||
|
default:
|
||||||
|
acc.AddFields(n.metricName, fields, tags)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -564,6 +587,7 @@ func init() {
|
||||||
Endpoint: "opc.tcp://localhost:4840",
|
Endpoint: "opc.tcp://localhost:4840",
|
||||||
SecurityPolicy: "auto",
|
SecurityPolicy: "auto",
|
||||||
SecurityMode: "auto",
|
SecurityMode: "auto",
|
||||||
|
Timestamp: "gather",
|
||||||
RequestTimeout: config.Duration(5 * time.Second),
|
RequestTimeout: config.Duration(5 * time.Second),
|
||||||
ConnectTimeout: config.Duration(10 * time.Second),
|
ConnectTimeout: config.Duration(10 * time.Second),
|
||||||
Certificate: "/etc/telegraf/cert.pem",
|
Certificate: "/etc/telegraf/cert.pem",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue