Skip to content
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

Using redis for logs #223

Merged
merged 9 commits into from
Mar 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Vagrantfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.provision "shell" do |s|
s.path = "deploy/provision.sh"
s.args = [
"--nginx", "--postgres", "--enroll", "--all-hostname",
"--nginx", "--postgres", "--redis", "--enroll", "--all-hostname",
IP_ADDRESS, "--password", "admin"
]
privileged = false
Expand Down
8 changes: 4 additions & 4 deletions admin/handlers/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package handlers

import (
"github.com/jmpsec/osctrl/admin/sessions"
"github.com/jmpsec/osctrl/cache"
"github.com/jmpsec/osctrl/carves"
"github.com/jmpsec/osctrl/environments"
"github.com/jmpsec/osctrl/logging"
"github.com/jmpsec/osctrl/metrics"
"github.com/jmpsec/osctrl/nodes"
"github.com/jmpsec/osctrl/queries"
Expand Down Expand Up @@ -44,7 +44,7 @@ type HandlersAdmin struct {
Carves *carves.Carves
Settings *settings.Settings
Metrics *metrics.Metrics
LoggerDB *logging.LoggerDB
RedisCache *cache.RedisManager
Sessions *sessions.SessionManager
ServiceVersion string
TemplatesFolder string
Expand Down Expand Up @@ -108,9 +108,9 @@ func WithMetrics(metrics *metrics.Metrics) HandlersOption {
}
}

func WithLoggerDB(logger *logging.LoggerDB) HandlersOption {
func WithCache(rds *cache.RedisManager) HandlersOption {
return func(h *HandlersAdmin) {
h.LoggerDB = logger
h.RedisCache = rds
}
}

Expand Down
45 changes: 27 additions & 18 deletions admin/handlers/json-logs.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
package handlers

import (
"encoding/json"
"log"
"net/http"
"strconv"

"github.com/gorilla/mux"
"github.com/jmpsec/osctrl/admin/sessions"
"github.com/jmpsec/osctrl/settings"
"github.com/jmpsec/osctrl/types"
"github.com/jmpsec/osctrl/users"
"github.com/jmpsec/osctrl/utils"
)

// Define log types to be used
var (
LogTypes = map[string]bool{
"result": true,
"status": true,
types.ResultLog: true,
types.StatusLog: true,
}
)

Expand Down Expand Up @@ -122,8 +124,8 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request)
}
// Get logs
logJSON := []LogJSON{}
if logType == "status" && h.LoggerDB != nil {
statusLogs, err := h.LoggerDB.StatusLogs(UUID, env.Name, secondsBack)
if logType == types.StatusLog && h.RedisCache != nil {
statusLogs, err := h.RedisCache.StatusLogs(UUID, env.Name, secondsBack)
if err != nil {
log.Printf("error getting logs %v", err)
h.Inc(metricJSONErr)
Expand All @@ -132,8 +134,8 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request)
// Prepare data to be returned
for _, s := range statusLogs {
_c := CreationTimes{
Display: utils.PastFutureTimes(s.CreatedAt),
Timestamp: utils.TimeTimestamp(s.CreatedAt),
Display: utils.PastFutureTimesEpoch(int64(s.UnixTime)),
Timestamp: strconv.Itoa(int(s.UnixTime)),
}
_l := LogJSON{
Created: _c,
Expand All @@ -142,8 +144,8 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request)
}
logJSON = append(logJSON, _l)
}
} else if logType == "result" && h.LoggerDB != nil {
resultLogs, err := h.LoggerDB.ResultLogs(UUID, env.Name, secondsBack)
} else if logType == types.ResultLog && h.RedisCache != nil {
resultLogs, err := h.RedisCache.ResultLogs(UUID, env.Name, secondsBack)
if err != nil {
log.Printf("error getting logs %v", err)
h.Inc(metricJSONErr)
Expand All @@ -153,8 +155,8 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request)
for _, r := range resultLogs {
_l := LogJSON{
Created: CreationTimes{
Display: utils.PastFutureTimes(r.CreatedAt),
Timestamp: utils.TimeTimestamp(r.CreatedAt),
Display: utils.PastFutureTimesEpoch(int64(r.UnixTime)),
Timestamp: strconv.Itoa(int(r.UnixTime)),
},
First: r.Name,
Second: string(r.Columns),
Expand Down Expand Up @@ -191,10 +193,11 @@ func (h *HandlersAdmin) JSONQueryLogsHandler(w http.ResponseWriter, r *http.Requ
h.Inc(metricJSONErr)
return
}
// Get logs
// Iterate through targets to get logs
queryLogJSON := []QueryLogJSON{}
if h.LoggerDB != nil {
queryLogs, err := h.LoggerDB.QueryLogs(name)
// Get logs
if h.RedisCache != nil {
queryLogs, err := h.RedisCache.QueryLogs(name)
if err != nil {
log.Printf("error getting logs %v", err)
h.Inc(metricJSONErr)
Expand All @@ -203,22 +206,28 @@ func (h *HandlersAdmin) JSONQueryLogsHandler(w http.ResponseWriter, r *http.Requ
// Prepare data to be returned
for _, q := range queryLogs {
// Get target node
node, err := h.Nodes.GetByUUID(q.UUID)
node, err := h.Nodes.GetByUUID(q.HostIdentifier)
if err != nil {
node.UUID = q.UUID
node.UUID = q.HostIdentifier
node.Localname = ""
}
_c := CreationTimes{
Display: utils.PastFutureTimes(q.CreatedAt),
Timestamp: utils.TimeTimestamp(q.CreatedAt),
Display: utils.PastFutureTimesEpoch(int64(q.UnixTime)),
Timestamp: utils.PastFutureTimesEpoch(int64(q.UnixTime)),
}
qData, err := json.Marshal(q.QueryData)
if err != nil {
log.Printf("error serializing logs %v", err)
h.Inc(metricJSONErr)
continue
}
_l := QueryLogJSON{
Created: _c,
Target: QueryTargetNode{
UUID: node.UUID,
Name: node.Localname,
},
Data: string(q.Data),
Data: string(qData),
}
queryLogJSON = append(queryLogJSON, _l)
}
Expand Down
2 changes: 0 additions & 2 deletions admin/handlers/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -920,8 +920,6 @@ func (h *HandlersAdmin) NodeHandler(w http.ResponseWriter, r *http.Request) {
funcMap := template.FuncMap{
"pastFutureTimes": utils.PastFutureTimes,
"jsonRawIndent": jsonRawIndent,
"statusLogsLink": h.statusLogsLink,
"resultLogsLink": h.resultLogsLink,
}
// Prepare template
tempateFiles := NewTemplateFiles(h.TemplatesFolder, "node.html").filepaths
Expand Down
18 changes: 7 additions & 11 deletions admin/handlers/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ import (
"github.com/jmpsec/osctrl/utils"
)

const (
QueryLink string = "/query/logs/{{NAME}}"
StatusLink string = "#status-logs"
ResultsLink string = "#result-logs"
)

// Helper to handle admin error responses
func adminErrorResponse(w http.ResponseWriter, msg string, code int, err error) {
log.Printf("%s: %v", msg, err)
Expand Down Expand Up @@ -187,17 +193,7 @@ func toJSONConfigurationService(values []settings.SettingValue) types.JSONConfig

// Helper to generate a link to results for on-demand queries
func (h *HandlersAdmin) queryResultLink(name string) string {
return strings.Replace(h.Settings.QueryResultLink(), "{{NAME}}", removeBackslash(name), 1)
}

// Helper to generate a link to results for status logs
func (h *HandlersAdmin) statusLogsLink(uuid string) string {
return strings.Replace(h.Settings.StatusLogsLink(), "{{UUID}}", removeBackslash(uuid), 1)
}

// Helper to generate a link to results for result logs
func (h *HandlersAdmin) resultLogsLink(uuid string) string {
return strings.Replace(h.Settings.ResultLogsLink(), "{{UUID}}", removeBackslash(uuid), 1)
return strings.Replace(QueryLink, "{{NAME}}", removeBackslash(name), 1)
}

// Helper to convert the list of all TLS environments with the ones with permissions for a user
Expand Down
Loading