Class: AllStak::Modules::Database
- Inherits:
-
Object
- Object
- AllStak::Modules::Database
- Defined in:
- lib/allstak/modules/database.rb
Overview
Database query telemetry, batched up to 100 per POST.
Constant Summary collapse
- PATH =
"/ingest/v1/db".freeze
- BATCH_SIZE =
100
Class Method Summary collapse
Instance Method Summary collapse
- #flush ⇒ Object
-
#initialize(transport, config, logger) ⇒ Database
constructor
A new instance of Database.
- #record(sql:, duration_ms:, status: "success", error_message: nil, database_name: nil, database_type: nil, query_type: nil, rows_affected: -1,, trace_id: nil, span_id: nil) ⇒ Object
- #shutdown ⇒ Object
Constructor Details
#initialize(transport, config, logger) ⇒ Database
Returns a new instance of Database.
10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/allstak/modules/database.rb', line 10 def initialize(transport, config, logger) @transport = transport @config = config @logger = logger @buffer = Transport::FlushBuffer.new( name: "database", max_size: config.buffer_size, interval_ms: config.flush_interval_ms, flush_proc: method(:flush_batch), logger: logger ) end |
Class Method Details
.detect_query_type(sql) ⇒ Object
67 68 69 70 |
# File 'lib/allstak/modules/database.rb', line 67 def self.detect_query_type(sql) first = sql.to_s.strip.split(/\s+/, 2).first.to_s.upcase %w[SELECT INSERT UPDATE DELETE].include?(first) ? first : "OTHER" end |
.hash_query(normalized) ⇒ Object
63 64 65 |
# File 'lib/allstak/modules/database.rb', line 63 def self.hash_query(normalized) Digest::MD5.hexdigest(normalized)[0, 16] end |
.normalize_query(sql) ⇒ Object
55 56 57 58 59 60 61 |
# File 'lib/allstak/modules/database.rb', line 55 def self.normalize_query(sql) s = sql.to_s.dup s.gsub!(/'[^']*'/, "?") s.gsub!(/\b\d+(\.\d+)?\b/, "?") s.gsub!(/\s+/, " ") s.strip end |
Instance Method Details
#flush ⇒ Object
47 48 49 |
# File 'lib/allstak/modules/database.rb', line 47 def flush @buffer.flush end |
#record(sql:, duration_ms:, status: "success", error_message: nil, database_name: nil, database_type: nil, query_type: nil, rows_affected: -1,, trace_id: nil, span_id: nil) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/allstak/modules/database.rb', line 23 def record(sql:, duration_ms:, status: "success", error_message: nil, database_name: nil, database_type: nil, query_type: nil, rows_affected: -1, trace_id: nil, span_id: nil) return if @transport.disabled? normalized = self.class.normalize_query(sql) @buffer.push({ normalizedQuery: normalized, queryHash: self.class.hash_query(normalized), queryType: query_type || self.class.detect_query_type(normalized), durationMs: [duration_ms.to_i, 0].max, timestampMillis: (Time.now.to_f * 1000).to_i, status: status, errorMessage: && .to_s[0, 500], databaseName: database_name, databaseType: database_type, service: @config.service_name, environment: @config.environment, release: @config.respond_to?(:release) ? @config.release : nil, traceId: trace_id, spanId: span_id, rowsAffected: rows_affected }.compact) end |
#shutdown ⇒ Object
51 52 53 |
# File 'lib/allstak/modules/database.rb', line 51 def shutdown @buffer.shutdown end |