Skip to content

Commit

Permalink
Add tag for target url to phpfpm input (influxdata#3928)
Browse files Browse the repository at this point in the history
  • Loading branch information
danielnelson authored Mar 23, 2018
1 parent 3658ac8 commit be9d4f4
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 63 deletions.
110 changes: 52 additions & 58 deletions plugins/inputs/phpfpm/README.md
Original file line number Diff line number Diff line change
@@ -1,65 +1,59 @@
# Telegraf plugin: phpfpm

Get phpfpm stat using either HTTP status page or fpm socket.

# Measurements

Meta:

- tags: `pool=poolname`

Measurement names:

- phpfpm

Measurement field:

- accepted_conn
- listen_queue
- max_listen_queue
- listen_queue_len
- idle_processes
- active_processes
- total_processes
- max_active_processes
- max_children_reached
- slow_requests

# Example output

Using this configuration:

```
[phpfpm]
# An array of address to gather stats about. Specify an ip on hostname
# with optional port and path. ie localhost, 10.10.3.33/server-status, etc.
#
# We can configure in three modes:
# - unixsocket: the string is the path to fpm socket like
# /var/run/php5-fpm.sock
# - http: the URL has to start with http:// or https://
# - fcgi: the URL has to start with fcgi:// or cgi://, and socket port must present
#
# If no servers are specified, then default to 127.0.0.1/server-status
urls = ["http://localhost/status", "10.0.0.12:/var/run/php5-fpm-www2.sock", "fcgi://10.0.0.12:9000/status"]
# PHP-FPM Input Plugin

Get phpfpm stats using either HTTP status page or fpm socket.

### Configuration:

```toml
# Read metrics of phpfpm, via HTTP status page or socket
[[inputs.phpfpm]]
## An array of addresses to gather stats about. Specify an ip or hostname
## with optional port and path
##
## Plugin can be configured in three modes (either can be used):
## - http: the URL must start with http:// or https://, ie:
## "http://localhost/status"
## "http://192.168.130.1/status?full"
##
## - unixsocket: path to fpm socket, ie:
## "/var/run/php5-fpm.sock"
## or using a custom fpm status path:
## "/var/run/php5-fpm.sock:fpm-custom-status-path"
##
## - fcgi: the URL must start with fcgi:// or cgi://, and port must be present, ie:
## "fcgi://10.0.0.12:9000/status"
## "cgi://10.0.10.12:9001/status"
##
## Example of multiple gathering from local socket and remove host
## urls = ["http://192.168.1.20/status", "/tmp/fpm.sock"]
urls = ["http://localhost/status"]
```

When run with:
When using `unixsocket`, you have to ensure that telegraf runs on same
host, and socket path is accessible to telegraf user.

```
./telegraf --config telegraf.conf --input-filter phpfpm --test
```
### Metrics:

It produces:
- phpfpm
- tags:
- pool
- url
- fields:
- accepted_conn
- listen_queue
- max_listen_queue
- listen_queue_len
- idle_processes
- active_processes
- total_processes
- max_active_processes
- max_children_reached
- slow_requests

# Example Output

```
* Plugin: phpfpm, Collection 1
> phpfpm,pool=www accepted_conn=13i,active_processes=2i,idle_processes=1i,listen_queue=0i,listen_queue_len=0i,max_active_processes=2i,max_children_reached=0i,max_listen_queue=0i,slow_requests=0i,total_processes=3i 1453011293083331187
> phpfpm,pool=www2 accepted_conn=12i,active_processes=1i,idle_processes=2i,listen_queue=0i,listen_queue_len=0i,max_active_processes=2i,max_children_reached=0i,max_listen_queue=0i,slow_requests=0i,total_processes=3i 1453011293083691422
> phpfpm,pool=www3 accepted_conn=11i,active_processes=1i,idle_processes=2i,listen_queue=0i,listen_queue_len=0i,max_active_processes=2i,max_children_reached=0i,max_listen_queue=0i,slow_requests=0i,total_processes=3i 1453011293083691658
phpfpm,pool=www accepted_conn=13i,active_processes=2i,idle_processes=1i,listen_queue=0i,listen_queue_len=0i,max_active_processes=2i,max_children_reached=0i,max_listen_queue=0i,slow_requests=0i,total_processes=3i 1453011293083331187
phpfpm,pool=www2 accepted_conn=12i,active_processes=1i,idle_processes=2i,listen_queue=0i,listen_queue_len=0i,max_active_processes=2i,max_children_reached=0i,max_listen_queue=0i,slow_requests=0i,total_processes=3i 1453011293083691422
phpfpm,pool=www3 accepted_conn=11i,active_processes=1i,idle_processes=2i,listen_queue=0i,listen_queue_len=0i,max_active_processes=2i,max_children_reached=0i,max_listen_queue=0i,slow_requests=0i,total_processes=3i 1453011293083691658
```

## Note

When using `unixsocket`, you have to ensure that telegraf runs on same
host, and socket path is accessible to telegraf user.
11 changes: 6 additions & 5 deletions plugins/inputs/phpfpm/phpfpm.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,11 +148,11 @@ func (g *phpfpm) gatherServer(addr string, acc telegraf.Accumulator) error {
return err
}

return g.gatherFcgi(fcgi, statusPath, acc)
return g.gatherFcgi(fcgi, statusPath, acc, addr)
}

// Gather stat using fcgi protocol
func (g *phpfpm) gatherFcgi(fcgi *conn, statusPath string, acc telegraf.Accumulator) error {
func (g *phpfpm) gatherFcgi(fcgi *conn, statusPath string, acc telegraf.Accumulator, addr string) error {
fpmOutput, fpmErr, err := fcgi.Request(map[string]string{
"SCRIPT_NAME": "/" + statusPath,
"SCRIPT_FILENAME": statusPath,
Expand All @@ -164,7 +164,7 @@ func (g *phpfpm) gatherFcgi(fcgi *conn, statusPath string, acc telegraf.Accumula
}, "/"+statusPath)

if len(fpmErr) == 0 && err == nil {
importMetric(bytes.NewReader(fpmOutput), acc)
importMetric(bytes.NewReader(fpmOutput), acc, addr)
return nil
} else {
return fmt.Errorf("Unable parse phpfpm status. Error: %v %v", string(fpmErr), err)
Expand Down Expand Up @@ -192,12 +192,12 @@ func (g *phpfpm) gatherHttp(addr string, acc telegraf.Accumulator) error {
addr, err)
}

importMetric(res.Body, acc)
importMetric(res.Body, acc, addr)
return nil
}

// Import stat data into Telegraf system
func importMetric(r io.Reader, acc telegraf.Accumulator) (poolStat, error) {
func importMetric(r io.Reader, acc telegraf.Accumulator, addr string) (poolStat, error) {
stats := make(poolStat)
var currentPool string

Expand Down Expand Up @@ -240,6 +240,7 @@ func importMetric(r io.Reader, acc telegraf.Accumulator) (poolStat, error) {
for pool := range stats {
tags := map[string]string{
"pool": pool,
"url": addr,
}
fields := make(map[string]interface{})
for k, v := range stats[pool] {
Expand Down
4 changes: 4 additions & 0 deletions plugins/inputs/phpfpm/phpfpm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ func TestPhpFpmGeneratesMetrics_From_Http(t *testing.T) {

tags := map[string]string{
"pool": "www",
"url": ts.URL,
}

fields := map[string]interface{}{
Expand Down Expand Up @@ -80,6 +81,7 @@ func TestPhpFpmGeneratesMetrics_From_Fcgi(t *testing.T) {

tags := map[string]string{
"pool": "www",
"url": r.Urls[0],
}

fields := map[string]interface{}{
Expand Down Expand Up @@ -124,6 +126,7 @@ func TestPhpFpmGeneratesMetrics_From_Socket(t *testing.T) {

tags := map[string]string{
"pool": "www",
"url": r.Urls[0],
}

fields := map[string]interface{}{
Expand Down Expand Up @@ -168,6 +171,7 @@ func TestPhpFpmGeneratesMetrics_From_Socket_Custom_Status_Path(t *testing.T) {

tags := map[string]string{
"pool": "www",
"url": r.Urls[0],
}

fields := map[string]interface{}{
Expand Down

0 comments on commit be9d4f4

Please sign in to comment.