Skip to content
Snippets Groups Projects
Unverified Commit 1e9d7cd6 authored by Daniel Nelson's avatar Daniel Nelson
Browse files

Add error status handle to tomcat input

parent a91457e0
No related branches found
No related tags found
No related merge requests found
...@@ -83,6 +83,7 @@ import ( ...@@ -83,6 +83,7 @@ import (
_ "github.com/influxdata/telegraf/plugins/inputs/system" _ "github.com/influxdata/telegraf/plugins/inputs/system"
_ "github.com/influxdata/telegraf/plugins/inputs/tail" _ "github.com/influxdata/telegraf/plugins/inputs/tail"
_ "github.com/influxdata/telegraf/plugins/inputs/tcp_listener" _ "github.com/influxdata/telegraf/plugins/inputs/tcp_listener"
_ "github.com/influxdata/telegraf/plugins/inputs/tomcat"
_ "github.com/influxdata/telegraf/plugins/inputs/trig" _ "github.com/influxdata/telegraf/plugins/inputs/trig"
_ "github.com/influxdata/telegraf/plugins/inputs/twemproxy" _ "github.com/influxdata/telegraf/plugins/inputs/twemproxy"
_ "github.com/influxdata/telegraf/plugins/inputs/udp_listener" _ "github.com/influxdata/telegraf/plugins/inputs/udp_listener"
......
# Tomcat Input Plugin # Tomcat Input Plugin
The Tomcat plugin collects statistics available from the tomcat manager status page from the `http://<host>/manager/status/all?XML=true URL.` The Tomcat plugin collects statistics available from the tomcat manager status page from the `http://<host>/manager/status/all?XML=true URL.` (`XML=true` will return only xml data).
(`XML=true` will return only xml data). See the [Tomcat documentation](https://tomcat.apache.org/tomcat-9.0-doc/manager-howto.html#Server_Status) for details of these statistics.
See the [Tomcat documentation](https://tomcat.apache.org/tomcat-9.0-doc/manager-howto.html#Server_Status) for details of these statistics.
### Configuration: ### Configuration:
```toml ```toml
# A Telegraf plugin to collect tomcat metrics. # Gather metrics from the Tomcat server status page.
[[inputs.tomcat]] [[inputs.tomcat]]
# A Tomcat status URI to gather stats. ## URL of the Tomcat server status
# Default is "http://127.0.0.1:8080/manager/status/all?XML=true". # url = "http://127.0.0.1:8080/manager/status/all?XML=true"
url = "http://127.0.0.1:8080/manager/status/all?XML=true"
# Credentials for status URI. ## HTTP Basic Auth Credentials
# Default is tomcat/s3cret. # username = "tomcat"
username = "tomcat" # password = "s3cret"
password = "s3cret"
## Request timeout
# timeout = "5s"
## Optional SSL Config
# ssl_ca = "/etc/telegraf/ca.pem"
# ssl_cert = "/etc/telegraf/cert.pem"
# ssl_key = "/etc/telegraf/key.pem"
## Use SSL but skip chain & host verification
# insecure_skip_verify = false
``` ```
### Measurements & Fields: ### Measurements & Fields:
- tomcat\_jvm\_memory - tomcat_jvm_memory
- free - free
- total - total
- max - max
- tomcat\_jvm\_memorypool - tomcat_jvm_memorypool
- max\_threads - max_threads
- current\_thread\_count - current_thread_count
- current\_threads\_busy - current_threads_busy
- max\_time - max_time
- processing\_time - processing_time
- request\_count - request_count
- error\_count - error_count
- bytes\_received - bytes_received
- bytes\_sent - bytes_sent
- tomcat\_connector - tomcat_connector
- max\_threads - max_threads
- current\_thread\_count - current_thread_count
- current\_thread\_busy - current_thread_busy
- max\_time - max_time
- processing\_time - processing_time
- request\_count - request_count
- error\_count - error_count
- bytes\_received - bytes_received
- bytes\_sent - bytes_sent
### Tags: ### Tags:
- tomcat\_jvm\_memorypool has the following tags: - tomcat_jvm_memorypool has the following tags:
- name - name
- type - type
- tomcat\_connector - tomcat_connector
- name - name
### Sample Queries:
TODO
### Example Output: ### Example Output:
``` ```
$ ./telegraf -config telegraf.conf -input-filter tomcat -test tomcat_jvm_memory,host=N8-MBP free=20014352i,max=127729664i,total=41459712i 1474663361000000000
* Plugin: tomcat, Collection 1 tomcat_jvm_memorypool,host=N8-MBP,name=Eden\ Space,type=Heap\ memory committed=11534336i,init=2228224i,max=35258368i,used=1941200i 1474663361000000000
> tomcat_jvm_memory,host=N8-MBP free=20014352i,max=127729664i,total=41459712i 1474663361000000000 tomcat_jvm_memorypool,host=N8-MBP,name=Survivor\ Space,type=Heap\ memory committed=1376256i,init=262144i,max=4390912i,used=1376248i 1474663361000000000
> tomcat_jvm_memorypool,host=N8-MBP,name=Eden\ Space,type=Heap\ memory committed=11534336i,init=2228224i,max=35258368i,used=1941200i 1474663361000000000 tomcat_jvm_memorypool,host=N8-MBP,name=Tenured\ Gen,type=Heap\ memory committed=28549120i,init=5636096i,max=88080384i,used=18127912i 1474663361000000000
> tomcat_jvm_memorypool,host=N8-MBP,name=Survivor\ Space,type=Heap\ memory committed=1376256i,init=262144i,max=4390912i,used=1376248i 1474663361000000000 tomcat_jvm_memorypool,host=N8-MBP,name=Code\ Cache,type=Non-heap\ memory committed=6946816i,init=2555904i,max=251658240i,used=6406528i 1474663361000000000
> tomcat_jvm_memorypool,host=N8-MBP,name=Tenured\ Gen,type=Heap\ memory committed=28549120i,init=5636096i,max=88080384i,used=18127912i 1474663361000000000 tomcat_jvm_memorypool,host=N8-MBP,name=Compressed\ Class\ Space,type=Non-heap\ memory committed=1966080i,init=0i,max=1073741824i,used=1816120i 1474663361000000000
> tomcat_jvm_memorypool,host=N8-MBP,name=Code\ Cache,type=Non-heap\ memory committed=6946816i,init=2555904i,max=251658240i,used=6406528i 1474663361000000000 tomcat_jvm_memorypool,host=N8-MBP,name=Metaspace,type=Non-heap\ memory committed=18219008i,init=0i,max=-1i,used=17559376i 1474663361000000000
> tomcat_jvm_memorypool,host=N8-MBP,name=Compressed\ Class\ Space,type=Non-heap\ memory committed=1966080i,init=0i,max=1073741824i,used=1816120i 1474663361000000000 tomcat_connector,host=N8-MBP,name=ajp-bio-8009 bytes_received=0i,bytes_sent=0i,current_thread_count=0i,current_threads_busy=0i,error_count=0i,max_threads=200i,max_time=0i,processing_time=0i,request_count=0i 1474663361000000000
> tomcat_jvm_memorypool,host=N8-MBP,name=Metaspace,type=Non-heap\ memory committed=18219008i,init=0i,max=-1i,used=17559376i 1474663361000000000 tomcat_connector,host=N8-MBP,name=http-bio-8080 bytes_received=0i,bytes_sent=86435i,current_thread_count=10i,current_threads_busy=1i,error_count=2i,max_threads=200i,max_time=167i,processing_time=245i,request_count=15i 1474663361000000000
> tomcat_connector,host=N8-MBP,name=ajp-bio-8009 bytes_received=0i,bytes_sent=0i,current_thread_count=0i,current_threads_busy=0i,error_count=0i,max_threads=200i,max_time=0i,processing_time=0i,request_count=0i 1474663361000000000
> tomcat_connector,host=N8-MBP,name=http-bio-8080 bytes_received=0i,bytes_sent=86435i,current_thread_count=10i,current_threads_busy=1i,error_count=2i,max_threads=200i,max_time=167i,processing_time=245i,request_count=15i 1474663361000000000
``` ```
...@@ -3,12 +3,13 @@ package tomcat ...@@ -3,12 +3,13 @@ package tomcat
import ( import (
"encoding/xml" "encoding/xml"
"fmt" "fmt"
"io/ioutil"
"net/http" "net/http"
"net/url" "net/url"
"strconv" "strconv"
"time"
"github.com/influxdata/telegraf" "github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/inputs"
) )
...@@ -61,20 +62,38 @@ type Tomcat struct { ...@@ -61,20 +62,38 @@ type Tomcat struct {
URL string URL string
Username string Username string
Password string Password string
Timeout internal.Duration
SSLCA string `toml:"ssl_ca"`
SSLCert string `toml:"ssl_cert"`
SSLKey string `toml:"ssl_key"`
InsecureSkipVerify bool
client *http.Client
request *http.Request
} }
var sampleconfig = ` var sampleconfig = `
## A Tomcat status URI to gather stats. ## URL of the Tomcat server status
## Default is "http://127.0.0.1:8080/manager/status/all?XML=true". # url = "http://127.0.0.1:8080/manager/status/all?XML=true"
url = "http://127.0.0.1:8080/manager/status/all?XML=true"
## Credentials for status URI. ## HTTP Basic Auth Credentials
## Default is tomcat/s3cret. # username = "tomcat"
username = "tomcat" # password = "s3cret"
password = "s3cret"
## Request timeout
# timeout = "5s"
## Optional SSL Config
# ssl_ca = "/etc/telegraf/ca.pem"
# ssl_cert = "/etc/telegraf/cert.pem"
# ssl_key = "/etc/telegraf/key.pem"
## Use SSL but skip chain & host verification
# insecure_skip_verify = false
` `
func (s *Tomcat) Description() string { func (s *Tomcat) Description() string {
return "A Telegraf plugin to collect tomcat metrics." return "Gather metrics from the Tomcat server status page."
} }
func (s *Tomcat) SampleConfig() string { func (s *Tomcat) SampleConfig() string {
...@@ -82,36 +101,40 @@ func (s *Tomcat) SampleConfig() string { ...@@ -82,36 +101,40 @@ func (s *Tomcat) SampleConfig() string {
} }
func (s *Tomcat) Gather(acc telegraf.Accumulator) error { func (s *Tomcat) Gather(acc telegraf.Accumulator) error {
if s.client == nil {
if s.URL == "" { client, err := s.createHttpClient()
s.URL = "http://127.0.0.1:8080/manager/status/all?XML=true" if err != nil {
} return err
}
if s.Username == "" { s.client = client
s.Username = "tomcat"
} }
if s.Password == "" { if s.request == nil {
s.Password = "s3cret" _, err := url.Parse(s.URL)
if err != nil {
return err
}
request, err := http.NewRequest("GET", s.URL, nil)
if err != nil {
return err
}
request.SetBasicAuth(s.Username, s.Password)
s.request = request
} }
_, err := url.Parse(s.URL) resp, err := s.client.Do(s.request)
if err != nil { if err != nil {
return fmt.Errorf("Unable to parse address '%s': %s", s.URL, err) return err
} }
defer resp.Body.Close()
req, err := http.NewRequest("GET", s.URL, nil) if resp.StatusCode != http.StatusOK {
req.SetBasicAuth(s.Username, s.Password) return fmt.Errorf("received HTTP status code %d from %q; expected 200",
cli := &http.Client{} resp.StatusCode, s.URL)
resp, err := cli.Do(req)
if err != nil {
return fmt.Errorf("Unable to call URL '%s': %s", s.URL, err)
} }
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
var status TomcatStatus var status TomcatStatus
xml.Unmarshal(body, &status) xml.NewDecoder(resp.Body).Decode(&status)
// add tomcat_jvm_memory measurements // add tomcat_jvm_memory measurements
tcm := map[string]interface{}{ tcm := map[string]interface{}{
...@@ -123,7 +146,6 @@ func (s *Tomcat) Gather(acc telegraf.Accumulator) error { ...@@ -123,7 +146,6 @@ func (s *Tomcat) Gather(acc telegraf.Accumulator) error {
// add tomcat_jvm_memorypool measurements // add tomcat_jvm_memorypool measurements
for _, mp := range status.TomcatJvm.JvmMemoryPools { for _, mp := range status.TomcatJvm.JvmMemoryPools {
tcmpTags := map[string]string{ tcmpTags := map[string]string{
"name": mp.Name, "name": mp.Name,
"type": mp.Type, "type": mp.Type,
...@@ -137,12 +159,10 @@ func (s *Tomcat) Gather(acc telegraf.Accumulator) error { ...@@ -137,12 +159,10 @@ func (s *Tomcat) Gather(acc telegraf.Accumulator) error {
} }
acc.AddFields("tomcat_jvm_memorypool", tcmpFields, tcmpTags) acc.AddFields("tomcat_jvm_memorypool", tcmpFields, tcmpTags)
} }
// add tomcat_connector measurements // add tomcat_connector measurements
for _, c := range status.TomcatConnectors { for _, c := range status.TomcatConnectors {
name, err := strconv.Unquote(c.Name) name, err := strconv.Unquote(c.Name)
if err != nil { if err != nil {
return fmt.Errorf("Unable to unquote name '%s': %s", c.Name, err) return fmt.Errorf("Unable to unquote name '%s': %s", c.Name, err)
...@@ -165,12 +185,35 @@ func (s *Tomcat) Gather(acc telegraf.Accumulator) error { ...@@ -165,12 +185,35 @@ func (s *Tomcat) Gather(acc telegraf.Accumulator) error {
} }
acc.AddFields("tomcat_connector", tccFields, tccTags) acc.AddFields("tomcat_connector", tccFields, tccTags)
} }
return nil return nil
} }
func (s *Tomcat) createHttpClient() (*http.Client, error) {
tlsConfig, err := internal.GetTLSConfig(
s.SSLCert, s.SSLKey, s.SSLCA, s.InsecureSkipVerify)
if err != nil {
return nil, err
}
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: tlsConfig,
},
Timeout: s.Timeout.Duration,
}
return client, nil
}
func init() { func init() {
inputs.Add("tomcat", func() telegraf.Input { return &Tomcat{} }) inputs.Add("tomcat", func() telegraf.Input {
return &Tomcat{
URL: "http://127.0.0.1:8080/manager/status/all?XML=true",
Username: "tomcat",
Password: "s3cret",
Timeout: internal.Duration{Duration: 5 * time.Second},
}
})
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment