| 188 | // Postgres |
| 189 | |
| 190 | public postgresQuery<R extends QueryResultRow = any, I extends any[] = any[]>( |
| 191 | queryString: string, |
| 192 | values: I | undefined, |
| 193 | tag: string, |
| 194 | client?: PoolClient |
| 195 | ): Promise<QueryResult<R>> { |
| 196 | return instrumentQuery(this.statsd, 'query.postgres', tag, async () => { |
| 197 | let fullQuery = '' |
| 198 | try { |
| 199 | fullQuery = getFinalPostgresQuery(queryString, values as any[]) |
| 200 | } catch {} |
| 201 | const timeout = timeoutGuard('Postgres slow query warning after 30 sec', { |
| 202 | queryString, |
| 203 | values, |
| 204 | fullQuery, |
| 205 | }) |
| 206 | |
| 207 | // Annotate query string to give context when looking at DB logs |
| 208 | queryString = `/* plugin-server:${tag} */ ${queryString}` |
| 209 | try { |
| 210 | if (client) { |
| 211 | return await client.query(queryString, values) |
| 212 | } else { |
| 213 | return await this.postgres.query(queryString, values) |
| 214 | } |
| 215 | } catch (error) { |
| 216 | if ( |
| 217 | error.message && |
| 218 | POSTGRES_UNAVAILABLE_ERROR_MESSAGES.some((message) => error.message.includes(message)) |
| 219 | ) { |
| 220 | throw new DependencyUnavailableError(error.message, 'Postgres', error) |
| 221 | } |
| 222 | throw error |
| 223 | } finally { |
| 224 | clearTimeout(timeout) |
| 225 | } |
| 226 | }) |
| 227 | } |
| 228 | |
| 229 | public postgresTransaction<ReturnType>( |
| 230 | tag: string, |