UNPKG

9.51 kBMarkdownView Raw
1# Copacetic
2[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
3[![Coverage Status](https://coveralls.io/repos/github/fresh8/copacetic/badge.svg?branch=master)](https://coveralls.io/github/fresh8/copacetic?branch=master)
4[![CircleCI](https://circleci.com/gh/fresh8/copacetic.svg?style=svg)](https://circleci.com/gh/fresh8/copacetic)
5
6A package to help your service check the health of its dependencies.
7
8
9## Requirements
10Node v6.4.0 and above
11
12## Installation
13```
14npm install @fresh8/copacetic --save
15```
16
17#### Quick Start - Javascript
18```javascript
19const Copacetic = require('@fresh8/copacetic')
20const level = require('@fresh8/copacetic').dependencyLevel
21
22const copacetic = Copacetic()
23
24// Register a dependency
25copacetic.registerDependency({
26 name: 'My-Dependency',
27 url: 'https://my-Dependency.io',
28 // Defaults to SOFT
29 level: level.HARD
30})
31
32
33// Check its health
34copacetic
35 .check({
36 name: 'My-Dependency',
37 retries: 2
38 })
39 .on('healthy', (Dependency) => {
40 /**
41 * { name: 'My-Dependency',
42 * healthy: true/false,
43 * lastChecked: Date,
44 * level: 'SOFT'
45 * }
46 */
47 })
48 .on('unhealthy', (Dependency) => {
49 // Handle degraded state...
50 })
51```
52
53#### Quick Start - Typescript
54```typescript
55import * as Copacetic from '@fresh8/copacetic'
56
57const copacetic = Copacetic('my-service')
58
59const myDependencyOverHttp : Copacetic.DependencyOptions = {
60 name: 'my-web-service',
61 url: 'http://example.com'
62}
63
64copacetic.registerDependency(myDependencyOverHttp)
65
66instance
67 .check({ name: 'my-web-service' })
68 .on('healthy', (res: Copacetic.Health) => {
69 // do something with your healthy dependency :)
70 })
71 .on('unhealthy', (res: Copacetic.Health) => {
72 // handle degraded state
73 })
74```
75
76<a name="Copacetic"></a>
77
78<a name="Copacetic"></a>
79
80## Copacetic ⇐ <code>EventEmitter</code>
81**Kind**: global class
82**Extends**: <code>EventEmitter</code>
83
84* [Copacetic](#Copacetic) ⇐ <code>EventEmitter</code>
85 * [new Copacetic([name])](#new_Copacetic_new)
86 * [.isHealthy](#Copacetic+isHealthy) ⇒ <code>Boolean</code>
87 * [.healthInfo](#Copacetic+healthInfo) ⇒ <code>Array.&lt;DependencyHealth&gt;</code>
88 * [.getDependency(dependency)](#Copacetic+getDependency) ⇒ <code>Dependency</code>
89 * [.isDependencyRegistered(dependency)](#Copacetic+isDependencyRegistered) ⇒ <code>Boolean</code>
90 * [.registerDependency(opts)](#Copacetic+registerDependency) ⇒ [<code>Copacetic</code>](#Copacetic)
91 * [.deregisterDependency(name)](#Copacetic+deregisterDependency) ⇒ [<code>Copacetic</code>](#Copacetic)
92 * [.pollAll([interval], [parallel], [schedule])](#Copacetic+pollAll) ⇒ [<code>Copacetic</code>](#Copacetic)
93 * [.poll([dependencies], [interval], [parallel], [schedule])](#Copacetic+poll) ⇒ [<code>Copacetic</code>](#Copacetic)
94 * [.stop()](#Copacetic+stop)
95 * [.checkAll([parallel])](#Copacetic+checkAll) ⇒ [<code>Copacetic</code>](#Copacetic)
96 * [.check([name], [dependencies], [retries], [parallel])](#Copacetic+check) ⇒ [<code>Copacetic</code>](#Copacetic)
97 * ["healthy"](#Copacetic+event_healthy)
98 * ["unhealthy"](#Copacetic+event_unhealthy)
99 * ["health"](#Copacetic+event_health)
100
101<a name="new_Copacetic_new"></a>
102
103### new Copacetic([name])
104
105| Param | Type | Default | Description |
106| --- | --- | --- | --- |
107| [name] | <code>String</code> | <code>&#x27;&#x27;</code> | The name of your service |
108
109<a name="Copacetic+isHealthy"></a>
110
111### copacetic.isHealthy ⇒ <code>Boolean</code>
112**Kind**: instance property of [<code>Copacetic</code>](#Copacetic)
113**Returns**: <code>Boolean</code> - Copacetic is healthy when all hard dependencies are healthy
114<a name="Copacetic+healthInfo"></a>
115
116### copacetic.healthInfo ⇒ <code>Array.&lt;DependencyHealth&gt;</code>
117**Kind**: instance property of [<code>Copacetic</code>](#Copacetic)
118**Returns**: <code>Array.&lt;DependencyHealth&gt;</code> - Health information on all dependencies
119<a name="Copacetic+getDependency"></a>
120
121### copacetic.getDependency(dependency) ⇒ <code>Dependency</code>
122**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
123
124| Param | Type |
125| --- | --- |
126| dependency | <code>Dependency</code> \| <code>String</code> |
127
128<a name="Copacetic+isDependencyRegistered"></a>
129
130### copacetic.isDependencyRegistered(dependency) ⇒ <code>Boolean</code>
131**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
132**Returns**: <code>Boolean</code> - Whether the dependency has been registered
133
134| Param | Type |
135| --- | --- |
136| dependency | <code>Dependency</code> \| <code>String</code> |
137
138<a name="Copacetic+registerDependency"></a>
139
140### copacetic.registerDependency(opts) ⇒ [<code>Copacetic</code>](#Copacetic)
141Adds a dependency to a Copacetic instance
142
143**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
144
145| Param | Type | Description |
146| --- | --- | --- |
147| opts | <code>Object</code> | The configuration for a dependency |
148
149<a name="Copacetic+deregisterDependency"></a>
150
151### copacetic.deregisterDependency(name) ⇒ [<code>Copacetic</code>](#Copacetic)
152Removes a dependency from a Copacetic instance
153
154**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
155
156| Param | Type | Description |
157| --- | --- | --- |
158| name | <code>String</code> | The name used to identify a dependency |
159
160<a name="Copacetic+pollAll"></a>
161
162### copacetic.pollAll([interval], [parallel], [schedule]) ⇒ [<code>Copacetic</code>](#Copacetic)
163Polls the health of all registered dependencies
164
165**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
166
167| Param | Type | Default |
168| --- | --- | --- |
169| [interval] | <code>String</code> | <code>&#x27;5 seconds&#x27;</code> |
170| [parallel] | <code>Boolean</code> | <code>true</code> |
171| [schedule] | <code>String</code> | <code>&#x27;start&#x27;</code> |
172
173<a name="Copacetic+poll"></a>
174
175### copacetic.poll([dependencies], [interval], [parallel], [schedule]) ⇒ [<code>Copacetic</code>](#Copacetic)
176Polls the health of a set of dependencies
177
178**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
179**Emits**: [<code>health</code>](#Copacetic+event_health)
180
181| Param | Type | Default | Description |
182| --- | --- | --- | --- |
183| [dependencies] | <code>Array.&lt;Object&gt;</code> | | An explicit set of dependencies to be polled |
184| [interval] | <code>String</code> | <code>&#x27;5 seconds&#x27;</code> | |
185| [parallel] | <code>Boolean</code> | <code>true</code> | Kick of health checks in parallel or series |
186| [schedule] | <code>String</code> | <code>&#x27;start&#x27;</code> | Schedule the next check to start (interval - ms) | ms |
187
188**Example**
189```js
190copacetic.poll({
191 dependencies: [
192 { name: 'my-dep' },
193 { name: 'my-other-dep', retries: 2 }
194 ],
195 schedule: 'end',
196 interval: '1 minute 30 seconds'
197})
198.on('health', (serviceHealth) => {
199 // Do something with the result
200 // [{ name: String, health: Boolean, level: HARD/SOFT, lastCheck: Date }]
201})
202```
203<a name="Copacetic+stop"></a>
204
205### copacetic.stop()
206stops polling registered dependencies
207
208**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
209<a name="Copacetic+checkAll"></a>
210
211### copacetic.checkAll([parallel]) ⇒ [<code>Copacetic</code>](#Copacetic)
212Checks the health of all registered dependencies
213
214**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
215
216| Param | Type | Default | Description |
217| --- | --- | --- | --- |
218| [parallel] | <code>Boolean</code> | <code>true</code> | Kick of health checks in parallel or series |
219
220<a name="Copacetic+check"></a>
221
222### copacetic.check([name], [dependencies], [retries], [parallel]) ⇒ [<code>Copacetic</code>](#Copacetic)
223Checks the health of a set, or single dependency
224
225**Kind**: instance method of [<code>Copacetic</code>](#Copacetic)
226**Emits**: [<code>health</code>](#Copacetic+event_health), [<code>healthy</code>](#Copacetic+event_healthy), [<code>unhealthy</code>](#Copacetic+event_unhealthy)
227
228| Param | Type | Default | Description |
229| --- | --- | --- | --- |
230| [name] | <code>String</code> | | The identifier of a single dependency to be checked |
231| [dependencies] | <code>Array.&lt;Object&gt;</code> | | An explicit set of dependencies to be checked |
232| [retries] | <code>Integer</code> | <code>1</code> | How many times should a dependency be checked, until it is deemed unhealthy |
233| [parallel] | <code>Boolean</code> | <code>true</code> | Kick of health checks in parallel or series |
234
235**Example**
236```js
237copacetic.check({ name: 'my-dependency' })
238```
239**Example**
240```js
241copacetic.check({ name: 'my-dependency', retries: 5 })
242.on('healthy', serviceHealth => { // Do stuff })
243.on('unhealthy', serviceHealth => { // Handle degraded state })
244```
245**Example**
246```js
247copacetic.check({ dependencies: [
248 { name: 'my-dep' },
249 { name: 'my-other-dep', retries: 2 }
250] })
251.on('health', (servicesHealth) => {
252 // Do something with the result
253 // [{ name: String, health: Boolean, level: HARD/SOFT, lastCheck: Date }]
254})
255```
256<a name="Copacetic+event_healthy"></a>
257
258### "healthy"
259Health information on a single dependency
260
261**Kind**: event emitted by [<code>Copacetic</code>](#Copacetic)
262<a name="Copacetic+event_unhealthy"></a>
263
264### "unhealthy"
265Health information on a single dependency
266
267**Kind**: event emitted by [<code>Copacetic</code>](#Copacetic)
268<a name="Copacetic+event_health"></a>
269
270### "health"
271Health information on a set of dependencies
272
273**Kind**: event emitted by [<code>Copacetic</code>](#Copacetic)