mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
implements an fb_exec_requests system table. The purpose of this table is to allow access to internal state to see what queries are running and have been run.
Co-authored-by: Travis Turner <travis@molecula.com>
(cherry picked from commit 47d8be26f5)
99 lines
2.7 KiB
Go
99 lines
2.7 KiB
Go
package pilosa
|
|
|
|
import (
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// ExecutionRequest holds data about an (sql) execution request
|
|
type ExecutionRequest struct {
|
|
// the id of the request
|
|
RequestID string
|
|
// the id of the user
|
|
UserID string
|
|
// time the request started
|
|
StartTime time.Time
|
|
// time the request finished - zero iif it has not finished
|
|
EndTime time.Time
|
|
// status of the request 'running' or 'complete' now, could have other values later
|
|
Status string
|
|
// future: if the request is waiting, the type of wait that is occuring
|
|
WaitType string
|
|
// future: the cumulative wait time for this request
|
|
WaitTime time.Duration
|
|
// futuure: if the request is waiting, the thing it is waiting on
|
|
WaitResource string
|
|
// future: the cululative cpu time for this request
|
|
CPUTime time.Duration
|
|
// the elapsed time for this request
|
|
ElapsedTime time.Duration
|
|
// future: the cumulative number of physical reads for this request
|
|
Reads int64
|
|
// future: the cumulative number of physical writes for this request
|
|
Writes int64
|
|
// future: the cumulative number of logical reads for this request
|
|
LogicalReads int64
|
|
// future: the cumulative number of rows affected for this request
|
|
RowCount int64
|
|
// the query plan for this request formatted in json
|
|
Plan string
|
|
// the sql for this request
|
|
SQL string
|
|
}
|
|
|
|
// Copy returns a copy of the ExecutionRequest passed
|
|
func (e *ExecutionRequest) Copy() ExecutionRequest {
|
|
var elapsedTime time.Duration
|
|
if !strings.EqualFold(e.Status, "complete") {
|
|
elapsedTime = time.Since(e.StartTime)
|
|
} else {
|
|
elapsedTime = e.EndTime.Sub(e.StartTime)
|
|
}
|
|
|
|
return ExecutionRequest{
|
|
RequestID: e.RequestID,
|
|
UserID: e.UserID,
|
|
StartTime: e.StartTime,
|
|
EndTime: e.EndTime,
|
|
Status: e.Status,
|
|
WaitType: e.WaitType,
|
|
WaitTime: e.WaitTime,
|
|
WaitResource: e.WaitResource,
|
|
CPUTime: e.CPUTime,
|
|
ElapsedTime: elapsedTime,
|
|
SQL: e.SQL,
|
|
Plan: e.Plan,
|
|
}
|
|
}
|
|
|
|
// ExecutionRequestsAPI defines the API for storing, updating and querying internal state
|
|
// around (sql) execution requests
|
|
type ExecutionRequestsAPI interface {
|
|
// add a request
|
|
AddRequest(requestID string, userID string, startTime time.Time, sql string) error
|
|
|
|
// update a request
|
|
UpdateRequest(requestID string,
|
|
endTime time.Time,
|
|
status string,
|
|
waitType string,
|
|
waitTime time.Duration,
|
|
waitResource string,
|
|
cpuTime time.Duration,
|
|
reads int64,
|
|
writes int64,
|
|
logicalReads int64,
|
|
rowCount int64,
|
|
plan string) error
|
|
|
|
// list all the requests
|
|
ListRequests() ([]ExecutionRequest, error)
|
|
|
|
// get a specific request
|
|
GetRequest(requestID string) (ExecutionRequest, error)
|
|
}
|
|
|
|
// SystemLayerAPI defines an api to allow access to internal FeatureBase state
|
|
type SystemLayerAPI interface {
|
|
ExecutionRequests() ExecutionRequestsAPI
|
|
}
|