diff --git a/.travis.yml b/.travis.yml index 30895c7..1fb1232 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,21 +2,25 @@ language: scala jdk: openjdk8 -node_js: - - 14 - scala: - 2.13.2 before_install: + - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash + - export NVM_DIR="$HOME/.nvm" + - nvm install node + - nvm use node + - nvm alias default node - npm install script: - sbt ++$TRAVIS_SCALA_VERSION clean coverage test coverageReport + - bash <(curl -s https://codecov.io/bash) -cF scala + - npm test -- --coverage --collectCoverageFrom=src/main/resources/dashboard/*.jsx + - bash <(curl -s https://codecov.io/bash) -cF javascript - sbt assembly - sbt docker:publishLocal after_success: - - bash <(curl -s https://codecov.io/bash) - docker build -t docker.pkg.github.com/amanjpro/greenish/greenish:$TRAVIS_TAG target/docker/stage - echo $GITHUB_RELEASES_TOKEN | docker login https://docker.pkg.github.com -u amanjpro --password-stdin - docker push docker.pkg.github.com/amanjpro/greenish/greenish:$TRAVIS_TAG diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..a58820a --- /dev/null +++ b/babel.config.js @@ -0,0 +1,4 @@ +module.exports = { + presets: ['@babel/preset-env', '@babel/preset-react'], + plugins: ["@babel/plugin-proposal-class-properties"] +}; diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..18d60d2 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +const {defaults} = require('jest-config'); + +module.exports = { + verbose: true, + collectCoverage: true, + coverageReporters: ["json", "html"], + transform: { + "^.+\\.jsx?$": "babel-jest" + }, + roots: [ + "", + "src/main/resources/dashboard" + ], + moduleDirectories: [ + "node_modules", + ], + "moduleNameMapper": { + "^./(.*)_container.js$": "src/main/resources/dashboard/$1_container.jsx", + "^./resources/(.*).js$": "/src/test/resources/json-samples/$1.js" + }, + "setupFilesAfterEnv": [ + "/jest.setup.js" + ] +}; diff --git a/jest.setup.js b/jest.setup.js new file mode 100644 index 0000000..b87443b --- /dev/null +++ b/jest.setup.js @@ -0,0 +1,6 @@ +import React from 'react'; + +import { configure } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; + +configure({ adapter: new Adapter() }); diff --git a/package.json b/package.json index 7ea1f32..064817c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,18 @@ "name": "greenish", "version": "1.4.0-SNAPSHOT", "devDependencies": { + "@babel/preset-env": "^7.0.0", + "@babel/preset-react": "^7.0.0", "babel-cli": "^6.0.0", - "babel-preset-react-app": "^3.0.0" + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-preset-react-app": "^3.0.0", + "enzyme": "^3.11.0", + "enzyme-adapter-react-16": "^1.15.2", + "jest": "^26.1.0", + "react": "^16.0.0", + "react-dom": "^16.0.0" + }, + "scripts": { + "test": "jest" } } diff --git a/src/main/resources/dashboard/group_container.jsx b/src/main/resources/dashboard/group_container.jsx index 2ad0cb7..8850c4f 100644 --- a/src/main/resources/dashboard/group_container.jsx +++ b/src/main/resources/dashboard/group_container.jsx @@ -1,3 +1,5 @@ +import React from 'react'; + class GroupContainer extends React.Component { intervalID constructor(props) { @@ -68,3 +70,5 @@ class GroupContainer extends React.Component { } } } + +export default VersionContainer; diff --git a/src/main/resources/dashboard/job_container.jsx b/src/main/resources/dashboard/job_container.jsx index 74fb7f0..6b5149b 100644 --- a/src/main/resources/dashboard/job_container.jsx +++ b/src/main/resources/dashboard/job_container.jsx @@ -1,3 +1,5 @@ +import React from 'react'; + class JobContainer extends React.Component { intervalID constructor(props) { @@ -71,3 +73,5 @@ class JobContainer extends React.Component { } } } + +export default VersionContainer; diff --git a/src/main/resources/dashboard/main_container.jsx b/src/main/resources/dashboard/main_container.jsx index d317f98..f52e472 100644 --- a/src/main/resources/dashboard/main_container.jsx +++ b/src/main/resources/dashboard/main_container.jsx @@ -1,3 +1,5 @@ +import React from 'react'; + const e = React.createElement; class MainContainer extends React.Component { @@ -81,3 +83,5 @@ class MainContainer extends React.Component { const domContainer = document.querySelector('#main_container'); ReactDOM.render(e(MainContainer), domContainer); + +export default VersionContainer; diff --git a/src/main/resources/dashboard/state_container.jsx b/src/main/resources/dashboard/state_container.jsx index f682e63..a2b3b1c 100644 --- a/src/main/resources/dashboard/state_container.jsx +++ b/src/main/resources/dashboard/state_container.jsx @@ -1,3 +1,5 @@ +import React from 'react'; + class StateContainer extends React.Component { intervalID constructor(props) { @@ -60,3 +62,5 @@ class StateContainer extends React.Component { } } } + +export default VersionContainer; diff --git a/src/main/resources/dashboard/summary_container.jsx b/src/main/resources/dashboard/summary_container.jsx index 2740f82..56a36b6 100644 --- a/src/main/resources/dashboard/summary_container.jsx +++ b/src/main/resources/dashboard/summary_container.jsx @@ -1,3 +1,5 @@ +import React from 'react'; + class SummaryContainer extends React.Component { intervalID constructor(props) { @@ -105,3 +107,5 @@ class SummaryContainer extends React.Component { } } } + +export default VersionContainer; diff --git a/src/main/resources/dashboard/time_container.jsx b/src/main/resources/dashboard/time_container.jsx index a50b50b..de218c2 100644 --- a/src/main/resources/dashboard/time_container.jsx +++ b/src/main/resources/dashboard/time_container.jsx @@ -1,3 +1,5 @@ +import React from 'react'; + class TimeContainer extends React.Component { intervalID constructor(props) { @@ -30,3 +32,5 @@ class TimeContainer extends React.Component { ) } } + +export default VersionContainer; diff --git a/src/main/resources/dashboard/version_container.jsx b/src/main/resources/dashboard/version_container.jsx index 9d33568..f0f6450 100644 --- a/src/main/resources/dashboard/version_container.jsx +++ b/src/main/resources/dashboard/version_container.jsx @@ -1,3 +1,5 @@ +import React from 'react'; + class VersionContainer extends React.Component { constructor(props) { super(props); @@ -51,3 +53,5 @@ class VersionContainer extends React.Component { } } } + +export default VersionContainer; diff --git a/src/test/js/version_container.test.js b/src/test/js/version_container.test.js new file mode 100644 index 0000000..aa7c7b9 --- /dev/null +++ b/src/test/js/version_container.test.js @@ -0,0 +1,95 @@ +import React from 'react'; + +import { shallow } from 'enzyme'; + +import VersionContainer from './version_container.js'; + +import { testObject } from './resources/system.js'; + +describe('VersionContainer', () => { + it('fetches version from server when server returns a successful response', done => { + const mockSuccessResponse = {}; + const mockJsonPromise = Promise.resolve(testObject); + const mockFetchPromise = Promise.resolve({ + json: () => mockJsonPromise, + }); + global.fetch = jest.fn().mockImplementation(() => mockFetchPromise); + + const wrapper = shallow(); + + expect(global.fetch).toHaveBeenCalledTimes(1); + expect(global.fetch).toHaveBeenCalledWith('/system'); + + process.nextTick(() => { + expect(wrapper.state()).toEqual({ + "error": null, + "isLoaded": true, + "version": "1.4.0-SNAPSHOT" + }); + + var rendered = wrapper.find('em').render(); + expect(rendered.text()).toContain("1.4.0-SNAPSHOT") + + global.fetch.mockClear(); + delete global.fetch; + done(); + }); + }); + + it('shows error, when a bad json is returned from API', done => { + const mockSuccessResponse = {}; + const mockJsonPromise = Promise.reject({"nah": "bad"}); + const mockFetchPromise = Promise.resolve({ + json: () => mockJsonPromise, + }); + global.fetch = jest.fn().mockImplementation(() => mockFetchPromise); + + const wrapper = shallow(); + + expect(global.fetch).toHaveBeenCalledTimes(1); + expect(global.fetch).toHaveBeenCalledWith('/system'); + + process.nextTick(() => { + expect(wrapper.state()).toEqual({ + "error": {"nah": "bad"}, + "isLoaded": true, + "version": null, + }); + + var rendered = wrapper.find('em').render(); + expect(rendered.text()).toContain("Error") + + + global.fetch.mockClear(); + delete global.fetch; + done(); + }); + }); + + it('shows loading, before loading is done', done => { + const mockSuccessResponse = {}; + const mockFetchPromise = new Promise(resolve => setTimeout(resolve, 1000)) + global.fetch = jest.fn().mockImplementation(() => mockFetchPromise); + + const wrapper = shallow(); + + expect(global.fetch).toHaveBeenCalledTimes(1); + expect(global.fetch).toHaveBeenCalledWith('/system'); + + process.nextTick(() => { + expect(wrapper.state()).toEqual({ + "error": null, + "isLoaded": false, + "version": null, + }); + + var rendered = wrapper.find('em').render(); + expect(rendered.text()).toContain("Loading") + + + global.fetch.mockClear(); + delete global.fetch; + done(); + }); + }); +}); diff --git a/src/test/resources/json-samples/group.js b/src/test/resources/json-samples/group.js new file mode 100644 index 0000000..09e430e --- /dev/null +++ b/src/test/resources/json-samples/group.js @@ -0,0 +1,290 @@ +module.exports = { + "testObject": { + { + "group": { + "group_id": 0, + "name": "Reporting Hourly Jobs", + "jobs": [ + { + "job_id": 0, + "name": "Raw event logs", + "prometheus_id": "reporting_hourly_jobs_raw_event_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + { + "job_id": 1, + "name": "Processed logs", + "prometheus_id": "reporting_hourly_jobs_processed_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + { + "job_id": 2, + "name": "Summary metrics", + "prometheus_id": "reporting_hourly_jobs_summary_metrics", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + { + "job_id": 3, + "name": "Summary report", + "prometheus_id": "reporting_hourly_jobs_summary_report", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + } + ] + }, + "status": [ + { + "job": { + "job_id": 0, + "name": "Raw event logs", + "prometheus_id": "reporting_hourly_jobs_raw_event_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126730945, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 1, + "name": "Processed logs", + "prometheus_id": "reporting_hourly_jobs_processed_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + "updated_at": 1595126730945, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 2, + "name": "Summary metrics", + "prometheus_id": "reporting_hourly_jobs_summary_metrics", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126730945, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 3, + "name": "Summary report", + "prometheus_id": "reporting_hourly_jobs_summary_report", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + "updated_at": 1595126730945, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + } + ] + } + } +} diff --git a/src/test/resources/json-samples/job.js b/src/test/resources/json-samples/job.js new file mode 100644 index 0000000..78cb03e --- /dev/null +++ b/src/test/resources/json-samples/job.js @@ -0,0 +1,53 @@ +module.exports = { + "testObject": { + { + "job": { + "job_id": 0, + "name": "Raw event logs", + "prometheus_id": "reporting_hourly_jobs_raw_event_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126730945, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + } + } +} diff --git a/src/test/resources/json-samples/maxlag.js b/src/test/resources/json-samples/maxlag.js new file mode 100644 index 0000000..ff6d227 --- /dev/null +++ b/src/test/resources/json-samples/maxlag.js @@ -0,0 +1,7 @@ +module.exports = { + "testObject": { + { + "lag": 3 + } + } +} diff --git a/src/test/resources/json-samples/missing.js b/src/test/resources/json-samples/missing.js new file mode 100644 index 0000000..ecb3bc8 --- /dev/null +++ b/src/test/resources/json-samples/missing.js @@ -0,0 +1,476 @@ +module.exports = { + "testObject": { + [ + { + "group": { + "group_id": 0, + "name": "Reporting Hourly Jobs", + "jobs": [ + { + "job_id": 0, + "name": "Raw event logs", + "prometheus_id": "reporting_hourly_jobs_raw_event_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + { + "job_id": 1, + "name": "Processed logs", + "prometheus_id": "reporting_hourly_jobs_processed_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + { + "job_id": 2, + "name": "Summary metrics", + "prometheus_id": "reporting_hourly_jobs_summary_metrics", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + { + "job_id": 3, + "name": "Summary report", + "prometheus_id": "reporting_hourly_jobs_summary_report", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + } + ] + }, + "status": [ + { + "job": { + "job_id": 0, + "name": "Raw event logs", + "prometheus_id": "reporting_hourly_jobs_raw_event_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 1, + "name": "Processed logs", + "prometheus_id": "reporting_hourly_jobs_processed_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 2, + "name": "Summary metrics", + "prometheus_id": "reporting_hourly_jobs_summary_metrics", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 3, + "name": "Summary report", + "prometheus_id": "reporting_hourly_jobs_summary_report", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + } + ] + }, + { + "group": { + "group_id": 1, + "name": "Nighly jobs", + "jobs": [ + { + "job_id": 0, + "name": "Even log compacter", + "prometheus_id": "nighly_jobs_even_log_compacter", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd", + "frequency": "daily", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 2, + "normal": 3, + "warn": 4, + "critical": 5 + }, + "env": [] + }, + { + "job_id": 1, + "name": "Event log archiver", + "prometheus_id": "nighly_jobs_event_log_archiver", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd", + "frequency": "daily", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 3, + "normal": 4, + "warn": 5, + "critical": 6 + }, + "env": [] + } + ] + }, + "status": [ + { + "job": { + "job_id": 0, + "name": "Even log compacter", + "prometheus_id": "nighly_jobs_even_log_compacter", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd", + "frequency": "daily", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 2, + "normal": 3, + "warn": 4, + "critical": 5 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-13", + "ok": false + }, + { + "period": "2020-07-17", + "ok": false + }, + { + "period": "2020-07-18", + "ok": false + } + ] + }, + { + "job": { + "job_id": 1, + "name": "Event log archiver", + "prometheus_id": "nighly_jobs_event_log_archiver", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd", + "frequency": "daily", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 3, + "normal": 4, + "warn": 5, + "critical": 6 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-13", + "ok": false + }, + { + "period": "2020-07-17", + "ok": false + }, + { + "period": "2020-07-18", + "ok": false + } + ] + } + ] + }, + { + "group": { + "group_id": 2, + "name": "Monthly jobs", + "jobs": [ + { + "job_id": 0, + "name": "Billing reports", + "prometheus_id": "monthly_jobs_billing_reports", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM", + "frequency": "monthly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + { + "job_id": 1, + "name": "Exporter jobs", + "prometheus_id": "monthly_jobs_exporter_jobs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM", + "frequency": "monthly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + } + ] + }, + "status": [ + { + "job": { + "job_id": 0, + "name": "Billing reports", + "prometheus_id": "monthly_jobs_billing_reports", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM", + "frequency": "monthly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 1, + "name": "Exporter jobs", + "prometheus_id": "monthly_jobs_exporter_jobs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM", + "frequency": "monthly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-01", + "ok": false + } + ] + } + ] + } + ] + } +} diff --git a/src/test/resources/json-samples/state.js b/src/test/resources/json-samples/state.js new file mode 100644 index 0000000..57400b7 --- /dev/null +++ b/src/test/resources/json-samples/state.js @@ -0,0 +1,588 @@ +module.exports = { + "testObject": { + [ + { + "group": { + "group_id": 0, + "name": "Reporting Hourly Jobs", + "jobs": [ + { + "job_id": 0, + "name": "Raw event logs", + "prometheus_id": "reporting_hourly_jobs_raw_event_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + { + "job_id": 1, + "name": "Processed logs", + "prometheus_id": "reporting_hourly_jobs_processed_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + { + "job_id": 2, + "name": "Summary metrics", + "prometheus_id": "reporting_hourly_jobs_summary_metrics", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + { + "job_id": 3, + "name": "Summary report", + "prometheus_id": "reporting_hourly_jobs_summary_report", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + } + ] + }, + "status": [ + { + "job": { + "job_id": 0, + "name": "Raw event logs", + "prometheus_id": "reporting_hourly_jobs_raw_event_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 1, + "name": "Processed logs", + "prometheus_id": "reporting_hourly_jobs_processed_logs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 2, + "name": "Summary metrics", + "prometheus_id": "reporting_hourly_jobs_summary_metrics", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + }, + { + "job": { + "job_id": 3, + "name": "Summary report", + "prometheus_id": "reporting_hourly_jobs_summary_report", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd-HH", + "frequency": "hourly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 1, + "normal": 2, + "warn": 3, + "critical": 4 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-18-20", + "ok": true + }, + { + "period": "2020-07-18-21", + "ok": false + }, + { + "period": "2020-07-18-22", + "ok": true + }, + { + "period": "2020-07-18-23", + "ok": true + }, + { + "period": "2020-07-19-00", + "ok": false + }, + { + "period": "2020-07-19-01", + "ok": false + } + ] + } + ] + }, + { + "group": { + "group_id": 1, + "name": "Nighly jobs", + "jobs": [ + { + "job_id": 0, + "name": "Even log compacter", + "prometheus_id": "nighly_jobs_even_log_compacter", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd", + "frequency": "daily", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 2, + "normal": 3, + "warn": 4, + "critical": 5 + }, + "env": [] + }, + { + "job_id": 1, + "name": "Event log archiver", + "prometheus_id": "nighly_jobs_event_log_archiver", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd", + "frequency": "daily", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 3, + "normal": 4, + "warn": 5, + "critical": 6 + }, + "env": [] + } + ] + }, + "status": [ + { + "job": { + "job_id": 0, + "name": "Even log compacter", + "prometheus_id": "nighly_jobs_even_log_compacter", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd", + "frequency": "daily", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 2, + "normal": 3, + "warn": 4, + "critical": 5 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-13", + "ok": false + }, + { + "period": "2020-07-14", + "ok": true + }, + { + "period": "2020-07-15", + "ok": true + }, + { + "period": "2020-07-16", + "ok": true + }, + { + "period": "2020-07-17", + "ok": false + }, + { + "period": "2020-07-18", + "ok": false + } + ] + }, + { + "job": { + "job_id": 1, + "name": "Event log archiver", + "prometheus_id": "nighly_jobs_event_log_archiver", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM-dd", + "frequency": "daily", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 3, + "normal": 4, + "warn": 5, + "critical": 6 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-07-13", + "ok": false + }, + { + "period": "2020-07-14", + "ok": true + }, + { + "period": "2020-07-15", + "ok": true + }, + { + "period": "2020-07-16", + "ok": true + }, + { + "period": "2020-07-17", + "ok": false + }, + { + "period": "2020-07-18", + "ok": false + } + ] + } + ] + }, + { + "group": { + "group_id": 2, + "name": "Monthly jobs", + "jobs": [ + { + "job_id": 0, + "name": "Billing reports", + "prometheus_id": "monthly_jobs_billing_reports", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM", + "frequency": "monthly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + { + "job_id": 1, + "name": "Exporter jobs", + "prometheus_id": "monthly_jobs_exporter_jobs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM", + "frequency": "monthly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + } + ] + }, + "status": [ + { + "job": { + "job_id": 0, + "name": "Billing reports", + "prometheus_id": "monthly_jobs_billing_reports", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM", + "frequency": "monthly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-01", + "ok": false + }, + { + "period": "2020-02", + "ok": true + }, + { + "period": "2020-03", + "ok": true + }, + { + "period": "2020-04", + "ok": true + }, + { + "period": "2020-05", + "ok": true + }, + { + "period": "2020-06", + "ok": true + } + ] + }, + { + "job": { + "job_id": 1, + "name": "Exporter jobs", + "prometheus_id": "monthly_jobs_exporter_jobs", + "cmd": "/tmp/check /tmp", + "time_pattern": "yyyy-MM", + "frequency": "monthly", + "period_check_offset": 1, + "timezone": { + "zone_id": "UTC" + }, + "lookback": 6, + "alert_levels": { + "great": 0, + "normal": 1, + "warn": 2, + "critical": 3 + }, + "env": [] + }, + "updated_at": 1595126670907, + "period_health": [ + { + "period": "2020-01", + "ok": false + }, + { + "period": "2020-02", + "ok": true + }, + { + "period": "2020-03", + "ok": true + }, + { + "period": "2020-04", + "ok": true + }, + { + "period": "2020-05", + "ok": true + }, + { + "period": "2020-06", + "ok": true + } + ] + } + ] + } + ] + } +} diff --git a/src/test/resources/json-samples/summary.js b/src/test/resources/json-samples/summary.js new file mode 100644 index 0000000..bff9f5a --- /dev/null +++ b/src/test/resources/json-samples/summary.js @@ -0,0 +1,72 @@ +module.exports = { + "testObject": { + [ + { + "group_id": 0, + "name": "Reporting Hourly Jobs", + "status": [ + { + "job_id": 0, + "name": "Raw event logs", + "missing": 3, + "alert_level": "critical" + }, + { + "job_id": 1, + "name": "Processed logs", + "missing": 3, + "alert_level": "warn" + }, + { + "job_id": 2, + "name": "Summary metrics", + "missing": 3, + "alert_level": "critical" + }, + { + "job_id": 3, + "name": "Summary report", + "missing": 3, + "alert_level": "warn" + } + ] + }, + { + "group_id": 1, + "name": "Nighly jobs", + "status": [ + { + "job_id": 0, + "name": "Even log compacter", + "missing": 3, + "alert_level": "normal" + }, + { + "job_id": 1, + "name": "Event log archiver", + "missing": 3, + "alert_level": "great" + } + ] + }, + { + "group_id": 2, + "name": "Monthly jobs", + "status": [ + { + "job_id": 0, + "name": "Billing reports", + "missing": 1, + "alert_level": "normal" + }, + { + "job_id": 1, + "name": "Exporter jobs", + "missing": 1, + "alert_level": "normal" + } + ] + } + ] + } +} diff --git a/src/test/resources/json-samples/system.js b/src/test/resources/json-samples/system.js new file mode 100644 index 0000000..fdf7aae --- /dev/null +++ b/src/test/resources/json-samples/system.js @@ -0,0 +1,7 @@ +module.exports = { + "testObject": { + "service":"Greenish", + "version":"1.4.0-SNAPSHOT", + "uptime":1707873 + } +};