-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
(0.3.0) Postgres plugin: canonicalize & sanitize adress #490
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,17 +4,21 @@ import ( | |
"bytes" | ||
"database/sql" | ||
"fmt" | ||
"regexp" | ||
"strings" | ||
|
||
"github.com/influxdb/telegraf/plugins" | ||
|
||
_ "github.com/lib/pq" | ||
"github.com/lib/pq" | ||
) | ||
|
||
type Postgresql struct { | ||
Address string | ||
Databases []string | ||
OrderedColumns []string | ||
|
||
VerbatimAddress bool | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's just remove the If people were relying on tag values that contain their password, they really should take the pain and migrate to just the server URL. |
||
sanitizedAddress string | ||
} | ||
|
||
var ignoredColumns = map[string]bool{"datid": true, "datname": true, "stats_reset": true} | ||
|
@@ -34,6 +38,16 @@ var sampleConfig = ` | |
# | ||
address = "host=localhost user=postgres sslmode=disable" | ||
|
||
# Starting in 0.3.0 the default behavior is to convert the above given address to the | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. remove this as a config option |
||
# key value form and, for security, remove the password before using it to tag the | ||
# collected data. | ||
# | ||
# If you are using the URL form and/or have existing tooling matching against a previous | ||
# value, you might want to prevent this transformation / sanitization. Set the following | ||
# to true to leave it as entered for the tag. | ||
|
||
# verbatim_address = true | ||
|
||
# A list of databases to pull metrics about. If not specified, metrics for all | ||
# databases are gathered. | ||
# databases = ["app_production", "testing"] | ||
|
@@ -101,6 +115,27 @@ type scanner interface { | |
Scan(dest ...interface{}) error | ||
} | ||
|
||
var passwordKVMatcher, _ = regexp.Compile("password=\\S+ ?") | ||
|
||
func (p *Postgresql) SanitizedAddress() (_ string, err error) { | ||
var canonicalizedAddress string | ||
|
||
if p.sanitizedAddress == "" { | ||
if strings.HasPrefix(p.Address, "postgres://") || strings.HasPrefix(p.Address, "postgresql://") { | ||
canonicalizedAddress, err = pq.ParseURL(p.Address) | ||
if err != nil { | ||
return p.sanitizedAddress, err | ||
} | ||
} else { | ||
canonicalizedAddress = p.Address | ||
} | ||
|
||
p.sanitizedAddress = passwordKVMatcher.ReplaceAllString(canonicalizedAddress, "") | ||
} | ||
|
||
return p.sanitizedAddress, err | ||
} | ||
|
||
func (p *Postgresql) accRow(row scanner, acc plugins.Accumulator) error { | ||
var columnVars []interface{} | ||
var dbname bytes.Buffer | ||
|
@@ -130,7 +165,17 @@ func (p *Postgresql) accRow(row scanner, acc plugins.Accumulator) error { | |
dbname.WriteString(string(dbnameChars[i])) | ||
} | ||
|
||
tags := map[string]string{"server": p.Address, "db": dbname.String()} | ||
var tagAddress string | ||
if p.VerbatimAddress { | ||
tagAddress = p.Address | ||
} else { | ||
tagAddress, err = p.SanitizedAddress() | ||
if err != nil { | ||
return err | ||
} | ||
} | ||
|
||
tags := map[string]string{"server": tagAddress, "db": dbname.String()} | ||
|
||
fields := make(map[string]interface{}) | ||
for col, val := range columnMap { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is this really a breaking change?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's definitely not breaking in Telegraf proper; but it could certainly be breaking for tooling built around the data in influx.
but with the field aggregation its a kinda moot point vs 0.2