diff --git a/configobject/objecttypes/host/hoststate/hoststate.go b/configobject/objecttypes/host/hoststate/hoststate.go new file mode 100644 index 00000000..65e22069 --- /dev/null +++ b/configobject/objecttypes/host/hoststate/hoststate.go @@ -0,0 +1,142 @@ +package hoststate + +import ( + "git.icinga.com/icingadb/icingadb-main/configobject" + "git.icinga.com/icingadb/icingadb-main/connection" + "git.icinga.com/icingadb/icingadb-main/utils" +) + +var ( + ObjectInformation configobject.ObjectInformation + Fields = []string{ + "id", + "env_id", + "state_type", + "soft_state", + "hard_state", + "attempt", + "severity", + "output", + "long_output", + "performance_data", + "check_commandline", + "is_problem", + "is_handled", + "is_reachable", + "is_flapping", + "is_acknowledged", + "acknowledgement_comment_id", + "in_downtime", + "execution_time", + "latency", + "timeout", + "last_update", + "last_state_change", + "last_soft_state", + "last_hard_state", + "next_check", + } +) + +type HostState struct { + Id string `json:"id"` + EnvId string `json:"env_id"` + StateType float32 `json:"state_type"` + SoftState float32 `json:"state"` + HardState float32 `json:"last_hard_state"` + Attempt float32 `json:"check_attempt"` + Severity float32 `json:"severity"` + Output string `json:"output"` + LongOutput string `json:"long_output"` + PerformanceData string `json:"performance_data"` + CheckCommandline string `json:"commandline"` + IsProblem bool `json:"is_problem"` + IsHandled bool `json:"is_handled"` + IsReachable bool `json:"is_reachable"` + IsFlapping bool `json:"is_flapping"` + IsAcknowledged bool `json:"is_acknowledged"` + AcknowledgementCommentId string `json:"acknowledgement_comment_id"` + InDowntime bool `json:"in_downtime"` + ExecutionTime float32 `json:"execution_time"` + Latency float32 `json:"latency"` + Timeout float32 `json:"check_timeout"` + LastUpdate float32 `json:"last_update"` + LastStateChange float32 `json:"last_state_change"` + LastSoftState float32 `json:"last_soft_state"` + LastHardState float32 `json:"last_hard_state"` + NextCheck float32 `json:"next_check"` +} + +func NewHostState() connection.Row { + h := HostState{} + + return &h +} + +func (h *HostState) InsertValues() []interface{} { + v := h.UpdateValues() + + return append([]interface{}{utils.Checksum(h.Id)}, v...) +} + +func (h *HostState) UpdateValues() []interface{} { + v := make([]interface{}, 0) + + v = append( + v, + utils.Checksum(h.EnvId), + utils.IcingaStateTypeToString(h.StateType), + h.SoftState, + h.HardState, + h.Attempt, + h.Severity, + h.Output, + h.LongOutput, + h.PerformanceData, + h.CheckCommandline, + utils.Bool[h.IsProblem], + utils.Bool[h.IsHandled], + utils.Bool[h.IsReachable], + utils.Bool[h.IsFlapping], + utils.Bool[h.IsAcknowledged], + utils.Checksum(h.AcknowledgementCommentId), + utils.Bool[h.InDowntime], + h.ExecutionTime, + h.Latency, + h.Timeout, + h.LastUpdate, + h.LastStateChange, + h.LastSoftState, + h.LastHardState, + h.NextCheck, + ) + + return v +} + +func (h *HostState) GetId() string { + return h.Id +} + +func (h *HostState) SetId(id string) { + h.Id = id +} + +func (h *HostState) GetFinalRows() ([]connection.Row, error) { + return []connection.Row{h}, nil +} + +func init() { + name := "host_state" + ObjectInformation = configobject.ObjectInformation{ + ObjectType: name, + RedisKey: "state:host", + DeltaMySqlField: "id", + Factory: NewHostState, + HasChecksum: false, + BulkInsertStmt: connection.NewBulkInsertStmt(name, Fields), + BulkDeleteStmt: connection.NewBulkDeleteStmt(name), + BulkUpdateStmt: connection.NewBulkUpdateStmt(name, Fields), + NotificationListenerType: "host", + } +} \ No newline at end of file diff --git a/configobject/objecttypes/service/servicestate/servicestate.go b/configobject/objecttypes/service/servicestate/servicestate.go new file mode 100644 index 00000000..64fa5ec2 --- /dev/null +++ b/configobject/objecttypes/service/servicestate/servicestate.go @@ -0,0 +1,142 @@ +package servicestate + +import ( + "git.icinga.com/icingadb/icingadb-main/configobject" + "git.icinga.com/icingadb/icingadb-main/connection" + "git.icinga.com/icingadb/icingadb-main/utils" +) + +var ( + ObjectInformation configobject.ObjectInformation + Fields = []string{ + "id", + "env_id", + "state_type", + "soft_state", + "hard_state", + "attempt", + "severity", + "output", + "long_output", + "performance_data", + "check_commandline", + "is_problem", + "is_handled", + "is_reachable", + "is_flapping", + "is_acknowledged", + "acknowledgement_comment_id", + "in_downtime", + "execution_time", + "latency", + "timeout", + "last_update", + "last_state_change", + "last_soft_state", + "last_hard_state", + "next_check", + } +) + +type ServiceState struct { + Id string `json:"id"` + EnvId string `json:"env_id"` + StateType float32 `json:"state_type"` + SoftState float32 `json:"state"` + HardState float32 `json:"last_hard_state"` + Attempt float32 `json:"check_attempt"` + Severity float32 `json:"severity"` + Output string `json:"output"` + LongOutput string `json:"long_output"` + PerformanceData string `json:"performance_data"` + CheckCommandline string `json:"commandline"` + IsProblem bool `json:"is_problem"` + IsHandled bool `json:"is_handled"` + IsReachable bool `json:"is_reachable"` + IsFlapping bool `json:"is_flapping"` + IsAcknowledged bool `json:"is_acknowledged"` + AcknowledgementCommentId string `json:"acknowledgement_comment_id"` + InDowntime bool `json:"in_downtime"` + ExecutionTime float32 `json:"execution_time"` + Latency float32 `json:"latency"` + Timeout float32 `json:"check_timeout"` + LastUpdate float32 `json:"last_update"` + LastStateChange float32 `json:"last_state_change"` + LastSoftState float32 `json:"last_soft_state"` + LastHardState float32 `json:"last_hard_state"` + NextCheck float32 `json:"next_check"` +} + +func NewServiceState() connection.Row { + s := ServiceState{} + + return &s +} + +func (s *ServiceState) InsertValues() []interface{} { + v := s.UpdateValues() + + return append([]interface{}{utils.Checksum(s.Id)}, v...) +} + +func (s *ServiceState) UpdateValues() []interface{} { + v := make([]interface{}, 0) + + v = append( + v, + utils.Checksum(s.EnvId), + utils.IcingaStateTypeToString(s.StateType), + s.SoftState, + s.HardState, + s.Attempt, + s.Severity, + s.Output, + s.LongOutput, + s.PerformanceData, + s.CheckCommandline, + utils.Bool[s.IsProblem], + utils.Bool[s.IsHandled], + utils.Bool[s.IsReachable], + utils.Bool[s.IsFlapping], + utils.Bool[s.IsAcknowledged], + utils.Checksum(s.AcknowledgementCommentId), + utils.Bool[s.InDowntime], + s.ExecutionTime, + s.Latency, + s.Timeout, + s.LastUpdate, + s.LastStateChange, + s.LastSoftState, + s.LastHardState, + s.NextCheck, + ) + + return v +} + +func (s *ServiceState) GetId() string { + return s.Id +} + +func (s *ServiceState) SetId(id string) { + s.Id = id +} + +func (s *ServiceState) GetFinalRows() ([]connection.Row, error) { + return []connection.Row{s}, nil +} + +func init() { + name := "service_state" + ObjectInformation = configobject.ObjectInformation{ + ObjectType: name, + RedisKey: "state:service", + DeltaMySqlField: "id", + Factory: NewServiceState, + HasChecksum: false, + BulkInsertStmt: connection.NewBulkInsertStmt(name, Fields), + BulkDeleteStmt: connection.NewBulkDeleteStmt(name), + BulkUpdateStmt: connection.NewBulkUpdateStmt(name, Fields), + NotificationListenerType: "service", + } +} \ No newline at end of file diff --git a/configobject/statesync/statesync.go b/configobject/statesync/statesync.go index e7783e78..d4a2d795 100644 --- a/configobject/statesync/statesync.go +++ b/configobject/statesync/statesync.go @@ -75,7 +75,7 @@ func syncStates(super *supervisor.Supervisor, objectType string) { _, errExec := super.Dbw.SqlExecTx( tx, "replace into "+objectType+"_state", - `REPLACE INTO `+objectType+`_state (`+objectType+`_id, env_id, state_type, soft_state, hard_state, attempt, severity, output, long_output, performance_data,`+ + `REPLACE INTO `+objectType+`_state (id, env_id, state_type, soft_state, hard_state, attempt, severity, output, long_output, performance_data,`+ `check_commandline, is_problem, is_handled, is_reachable, is_flapping, is_acknowledged, acknowledgement_comment_id,`+ `in_downtime, execution_time, latency, timeout, last_update, last_state_change, last_soft_state,`+ `last_hard_state, next_check) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, @@ -100,10 +100,10 @@ func syncStates(super *supervisor.Supervisor, objectType string) { values["execution_time"], redisIntToDBInt(values["latency"]), redisIntToDBInt(values["check_timeout"]), - values["last_state_change"], //TODO: ??? (also see MR) should be last_update + values["last_update"], values["last_state_change"], - values["state"], //TODO: Should be last_soft_state but is not implemented in core - values["last_hard_state"], //TODO: Should be last_hard_state but is not implemented in core + values["last_soft_state"], + values["last_hard_state"], values["next_check"], ) diff --git a/etc/schema/mysql/host.sql b/etc/schema/mysql/host.sql index e55fc19d..ca8d831d 100644 --- a/etc/schema/mysql/host.sql +++ b/etc/schema/mysql/host.sql @@ -108,7 +108,7 @@ CREATE TABLE hostgroup_customvar ( ) ENGINE=InnoDb ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; CREATE TABLE host_state ( - host_id binary(20) NOT NULL COMMENT 'host.id', + id binary(20) NOT NULL COMMENT 'host.id', env_id binary(20) NOT NULL COMMENT 'sha1(environment.name)', state_type enum('hard', 'soft') NOT NULL, @@ -142,5 +142,5 @@ CREATE TABLE host_state ( last_hard_state tinyint(1) unsigned NOT NULL, next_check bigint(20) unsigned NOT NULL, - PRIMARY KEY (host_id) + PRIMARY KEY (id) ) ENGINE=InnoDb ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; diff --git a/etc/schema/mysql/service.sql b/etc/schema/mysql/service.sql index 673a190d..eda8d222 100644 --- a/etc/schema/mysql/service.sql +++ b/etc/schema/mysql/service.sql @@ -101,7 +101,7 @@ CREATE TABLE servicegroup_customvar ( ) ENGINE=InnoDb ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; CREATE TABLE service_state ( - service_id binary(20) NOT NULL COMMENT 'service.id', + id binary(20) NOT NULL COMMENT 'service.id', env_id binary(20) NOT NULL COMMENT 'sha1(environment.name)', state_type enum('hard', 'soft') NOT NULL, @@ -135,5 +135,5 @@ CREATE TABLE service_state ( last_hard_state tinyint(1) unsigned NOT NULL, next_check bigint(20) unsigned NOT NULL, - PRIMARY KEY (service_id) + PRIMARY KEY (id) ) ENGINE=InnoDb ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin; diff --git a/main.go b/main.go index 7a4bf974..ab508ac6 100644 --- a/main.go +++ b/main.go @@ -21,6 +21,7 @@ import ( "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/host/hostcomment" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/host/hostcustomvar" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/host/hostdowntime" + "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/host/hoststate" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/hostgroup" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/hostgroup/hostgroupcustomvar" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/hostgroup/hostgroupmember" @@ -38,6 +39,7 @@ import ( "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/service/servicecomment" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/service/servicecustomvar" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/service/servicedowntime" + "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/service/servicestate" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/servicegroup" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/servicegroup/servicegroupcustomvar" "git.icinga.com/icingadb/icingadb-main/configobject/objecttypes/servicegroup/servicegroupmember" @@ -128,11 +130,13 @@ func startConfigSyncOperators(super *supervisor.Supervisor, haInstance *ha.HA) { &hostcustomvar.ObjectInformation, &hostdowntime.ObjectInformation, &hostcomment.ObjectInformation, + &hoststate.ObjectInformation, &service.ObjectInformation, &servicecustomvar.ObjectInformation, &servicedowntime.ObjectInformation, &servicecomment.ObjectInformation, + &servicestate.ObjectInformation, &hostgroup.ObjectInformation, &hostgroupcustomvar.ObjectInformation, diff --git a/utils/convert.go b/utils/convert.go index e6ac3253..c9424c51 100644 --- a/utils/convert.go +++ b/utils/convert.go @@ -70,4 +70,12 @@ func NotificationTypesToBitMask(types []string) int { mask += NotificationTypes[t] } return mask +} + +func IcingaStateTypeToString(stateType float32) string { + if stateType == 0 { + return "hard" + } else { + return "soft" + } } \ No newline at end of file