diff --git a/cmd/postgres_exporter/postgres_exporter.go b/cmd/postgres_exporter/postgres_exporter.go
index 39dd9a79..06fb0146 100644
--- a/cmd/postgres_exporter/postgres_exporter.go
+++ b/cmd/postgres_exporter/postgres_exporter.go
@@ -258,12 +258,13 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
 	},
 	"pg_stat_activity": {
 		map[string]ColumnMapping{
-			"datname":          {LABEL, "Name of this database", nil, nil},
-			"state":            {LABEL, "connection state", nil, semver.MustParseRange(">=9.2.0")},
-			"usename":          {LABEL, "Name of the user logged into this backend", nil, nil},
-			"application_name": {LABEL, "Name of the application that is connected to this backend", nil, nil},
-			"count":            {GAUGE, "number of connections in this state", nil, nil},
-			"max_tx_duration":  {GAUGE, "max duration in seconds any active transaction has been running", nil, nil},
+			"datname":             {LABEL, "Name of this database", nil, nil},
+			"state":               {LABEL, "connection state", nil, semver.MustParseRange(">=9.2.0")},
+			"usename":             {LABEL, "Name of the user logged into this backend", nil, nil},
+			"application_name":    {LABEL, "Name of the application that is connected to this backend", nil, nil},
+			"count":               {GAUGE, "number of connections in this state", nil, nil},
+			"max_tx_duration":     {GAUGE, "max duration in seconds any active transaction has been running", nil, nil},
+			"max_state_duration":  {GAUGE, "max state change duration in seconds any active transaction has been", nil, nil},
 		},
 		true,
 		0,
diff --git a/cmd/postgres_exporter/queries.go b/cmd/postgres_exporter/queries.go
index 57a1b749..d90d2c25 100644
--- a/cmd/postgres_exporter/queries.go
+++ b/cmd/postgres_exporter/queries.go
@@ -131,7 +131,8 @@ var queryOverrides = map[string][]OverrideQuery{
 				tmp2.usename,
 				tmp2.application_name,
 				COALESCE(count,0) as count,
-				COALESCE(max_tx_duration,0) as max_tx_duration
+				COALESCE(max_tx_duration,0) as max_tx_duration,
+				COALESCE(max_state_duration, 0) AS max_state_duration
 			FROM
 				(
 				  VALUES ('active'),
@@ -149,7 +150,8 @@ var queryOverrides = map[string][]OverrideQuery{
 					usename,
 					application_name,
 					count(*) AS count,
-					MAX(EXTRACT(EPOCH FROM now() - xact_start))::float AS max_tx_duration
+					MAX(EXTRACT(EPOCH FROM now() - xact_start))::float AS max_tx_duration,
+					MAX(EXTRACT(EPOCH FROM now() - state_change))::float AS max_state_duration
 				FROM pg_stat_activity GROUP BY datname,state,usename,application_name) AS tmp2
 				ON tmp.state = tmp2.state AND pg_database.datname = tmp2.datname
 			`,
@@ -163,7 +165,8 @@ var queryOverrides = map[string][]OverrideQuery{
 				usename,
 				application_name,
 				COALESCE(count(*),0) AS count,
-				COALESCE(MAX(EXTRACT(EPOCH FROM now() - xact_start))::float,0) AS max_tx_duration
+				COALESCE(MAX(EXTRACT(EPOCH FROM now() - xact_start))::float,0) AS max_tx_duration,
+				COALESCE(MAX(EXTRACT(EPOCH FROM now() - state_change))::float,0) AS max_state_duration
 			FROM pg_stat_activity GROUP BY datname,usename,application_name
 			`,
 		},