diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 8bd298f3098..0547557dbdc 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -97,6 +97,7 @@ TLS or Beats that accept connections over TLS and validate client certificates. - Add a `system/network_summary` metricset {pull}15196[15196] - Add mesh metricset for Istio Metricbeat module{pull}15535[15535] - Make the `system/cpu` metricset collect normalized CPU metrics by default. {issue}15618[15618] {pull}15729[15729] +- Add support for Unix socket in Memcached metricbeat module. {issue}13685[13685] {pull}15822[15822] *Packetbeat* diff --git a/metricbeat/module/memcached/stats/stats.go b/metricbeat/module/memcached/stats/stats.go index be66dfc3e68..52c938a6342 100644 --- a/metricbeat/module/memcached/stats/stats.go +++ b/metricbeat/module/memcached/stats/stats.go @@ -20,15 +20,20 @@ package stats import ( "bufio" "net" + "net/url" "strings" "github.com/pkg/errors" "github.com/elastic/beats/metricbeat/mb" + "github.com/elastic/beats/metricbeat/mb/parse" ) +var hostParser = parse.URLHostParserBuilder{DefaultScheme: "tcp"}.Build() + func init() { mb.Registry.MustAddMetricSet("memcached", "stats", New, + mb.WithHostParser(hostParser), mb.DefaultMetricSet(), ) } @@ -47,7 +52,12 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // format. It publishes the event which is then forwarded to the output. In case // of an error set the Error field of mb.Event or simply call report.Error(). func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { - conn, err := net.DialTimeout("tcp", m.Host(), m.Module().Config().Timeout) + network, address, err := m.getNetworkAndAddress() + if err != nil { + return errors.Wrap(err, "error in fetch") + } + + conn, err := net.DialTimeout(network, address, m.Module().Config().Timeout) if err != nil { return errors.Wrap(err, "error in fetch") } @@ -81,3 +91,15 @@ func (m *MetricSet) Fetch(reporter mb.ReporterV2) error { return nil } + +func (m *MetricSet) getNetworkAndAddress() (network string, address string, err error) { + hostData := m.HostData() + u, err := url.Parse(hostData.URI) + if err != nil { + err = errors.Wrap(err, "invalid URL") + return + } + network = u.Scheme + address = u.Host + return +}