Skip to content

Commit 5a33688

Browse files
author
Andy Lo-A-Foe
committed
Initial fresh commit for Inner/Open source
0 parents  commit 5a33688

17 files changed

+940
-0
lines changed

.cfignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*.env
2+
*.yml

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/*.env
2+
/*.yml
3+
/logproxy
4+
profile_file.out

Dockerfile

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# build stage
2+
FROM golang:1.11.0-alpine3.8 AS builder
3+
RUN apk add --no-cache git openssh gcc musl-dev
4+
WORKDIR /logproxy
5+
COPY . /logproxy
6+
RUN cd /logproxy && go build -o logproxy
7+
8+
FROM alpine:latest
9+
MAINTAINER Andy Lo-A-Foe <[email protected]>
10+
WORKDIR /app
11+
COPY --from=builder /logproxy/logproxy /app
12+
RUN apk --no-cache add ca-certificates
13+
14+
EXPOSE 8080
15+
CMD ["/app/logproxy"]

Procfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
web: logproxy

README.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
Logproxy
2+
========
3+
A Cloud foundry app which serves as a logdrain and forwards messages to HSDP Foundation logging. Supports the new HSDP v2 single tenant solution.
4+
5+
Features
6+
========
7+
- Supports v2 of the HSDP logging API
8+
- Batch uploads messages (max 25) for good performance
9+
- Requires little resources
10+
- Supports blue-green deployment
11+
12+
Dependencies
13+
============
14+
A RabbitMQ instance is required. This is used to handle spikes in log volume.
15+
16+
Environment variables
17+
=====================
18+
19+
| Variable | Description | Required |
20+
|---------------------------|--------------------------------------|----------|
21+
| TOKEN | Token to use as part of logdrain URL | Yes |
22+
| HSDP\_LOGINGESTOR\_KEY | HSDP logging service Key | Yes |
23+
| HSDP\_LOGINGESTOR\_SECRET | HSDP logging service Secret | Yes |
24+
| HSDP\_LOGINGESTOR\_URL | HSPD logging service endpoint | Yes |
25+
| HSDP\_LOGINGESTOR\_PRODUCT\_KEY | Product key for v2 logging | No |
26+
27+
Installation
28+
============
29+
See the below manifest.yml file as an example. Make sure you include the `logproxy` binary in the same folder as your `manifest.yml`. Also ensure the `logproxy` binary has *executable* privileges. (you can use the `chmod a+x logproxy` command on Linux based shells to achieve the result)
30+
31+
32+
```
33+
applications:
34+
- name: logproxy
35+
domain: your-domain.com
36+
instances: 2
37+
memory: 256M
38+
disk_quota: 1024M
39+
routes:
40+
- route: logproxy.your-domain.com
41+
buildpack: binary_buildpack
42+
env:
43+
HSDP_LOGINGESTOR_KEY: SomeKey
44+
HSDP_LOGINGESTOR_SECRET: SomeSecret
45+
HSDP_LOGINGESTOR_URL: https://logingestor-int2.us-east.philips-healthsuite.com
46+
HSDP_LOGINGESTOR_PRODUCT_KEY: product-uuid-here
47+
COMPONENT: PHS
48+
TOKEN: RandomTokenHere
49+
services:
50+
- rabbitmq
51+
stack: cflinuxfs2
52+
```
53+
54+
A `Procfile` is required as well:
55+
56+
```
57+
web: logproxy
58+
```
59+
60+
Now push the application:
61+
62+
```
63+
cf push
64+
```
65+
66+
If everything went OK logproxy should now be reachable on https://logproxy.your-domain.com . The logdrain endpoint would then be:
67+
68+
```
69+
https://logproxy.your-domain.com/syslog/drain/RandomTokenHere
70+
```
71+
72+
Configure logdrains
73+
===================
74+
In each space where you have apps running for which you'd like to drain logs define a user defined service called `logproxy`:
75+
76+
```
77+
cf cups logproxy -l https://logproxy.your-domain.com/syslog/drain/RandomTokenHere
78+
```
79+
80+
Then, bind this service to any app which should deliver their logs:
81+
82+
```
83+
cf bind-service some-app logproxy
84+
```
85+
86+
and restaert the app to activate the logdrain:
87+
88+
```
89+
cf restart some-app
90+
```
91+
92+
Logs should now start flowing from your app all the way to HSDP logging infra through lgoproxy. You can use Kibana for log searching.
93+
94+
95+
HSDP Slack
96+
==========
97+
Use the #logproxy channel on HSDP Slack for any questions you have. Main author is @andy
98+
99+
TODO
100+
====
101+
- Better handling of HTTP 635 errors
102+
- Retry mechanism in case of POST failures

docs/working.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"resourceType": "Bundle",
3+
"type": "transaction",
4+
"total": 1,
5+
"entry": [
6+
{
7+
"resource": {
8+
"resourceType": "LogEvent",
9+
"id": "7f4c85a8-e472-479f-b772-2916353d02a4",
10+
"applicationName": "OPS",
11+
"eventId": "110114",
12+
"category": "TRACELOG",
13+
"component": "TEST",
14+
"transactionId": "2abd7355-cbdd-43e1-b32a-43ec19cd98f0",
15+
"serviceName": "OPS",
16+
"applicationInstance": "INST‐00002",
17+
"applicationVersion": "1.0.0",
18+
"originatingUser": "SomeUsr",
19+
"serverName": "ops-dev.cloud.pcftest.com",
20+
"logTime": "2017-01-31T08:00:00Z",
21+
"severity": "INFO",
22+
"logData": {
23+
"message": "Test message"
24+
}
25+
}
26+
}
27+
]
28+
}

go.mod

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
module aemian.com/logproxy
2+
3+
require (
4+
github.com/BurntSushi/toml v0.3.0 // indirect
5+
github.com/azer/snakecase v0.0.0-20161028114325-c818dddafb5c // indirect
6+
github.com/cloudfoundry-community/gautocloud v0.0.0-20180511025038-6a958fd8ab8a // indirect
7+
github.com/cloudfoundry-community/go-cfenv v1.17.0 // indirect
8+
github.com/davecgh/go-spew v1.1.0 // indirect
9+
github.com/fsnotify/fsnotify v1.4.7 // indirect
10+
github.com/golang/mock v1.1.1 // indirect
11+
github.com/golang/protobuf v1.2.0 // indirect
12+
github.com/hashicorp/hcl v0.0.0-20171017181929-23c074d0eceb // indirect
13+
github.com/hpcloud/tail v1.0.0 // indirect
14+
github.com/influxdata/go-syslog v1.0.1
15+
github.com/jeffail/gabs v1.1.0 // indirect
16+
github.com/joho/godotenv v1.2.0
17+
github.com/labstack/echo v0.0.0-20171223171103-b338075a0fc6
18+
github.com/labstack/gommon v0.0.0-20170925052817-57409ada9da0 // indirect
19+
github.com/loafoe/go-rabbitmq v0.0.0-20180514175928-38d20cd36836
20+
github.com/m4rw3r/uuid v1.0.0
21+
github.com/magiconair/properties v1.7.6 // indirect
22+
github.com/mattn/go-colorable v0.0.9 // indirect
23+
github.com/mattn/go-isatty v0.0.3 // indirect
24+
github.com/mitchellh/mapstructure v0.0.0-20180111000720-b4575eea38cc // indirect
25+
github.com/onsi/ginkgo v1.6.0 // indirect
26+
github.com/onsi/gomega v1.4.1 // indirect
27+
github.com/pelletier/go-toml v1.1.0 // indirect
28+
github.com/philips-software/go-hsdp-api v0.0.0-20180817111852-d97ac1de7ba2
29+
github.com/philips-software/go-hsdp-signer v1.0.0 // indirect
30+
github.com/pmezard/go-difflib v1.0.0 // indirect
31+
github.com/satori/go.uuid v1.2.0 // indirect
32+
github.com/sirupsen/logrus v1.0.5
33+
github.com/spf13/afero v1.1.0 // indirect
34+
github.com/spf13/cast v1.2.0 // indirect
35+
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec // indirect
36+
github.com/spf13/pflag v1.0.1 // indirect
37+
github.com/spf13/viper v1.0.2 // indirect
38+
github.com/streadway/amqp v0.0.0-20180118175716-54ded0531dfd
39+
github.com/stretchr/testify v1.1.4
40+
github.com/valyala/bytebufferpool v1.0.0 // indirect
41+
github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4 // indirect
42+
golang.org/x/crypto v0.0.0-20180123095555-3d37316aaa6b // indirect
43+
golang.org/x/net v0.0.0-20171024115130-4b14673ba32b // indirect
44+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect
45+
golang.org/x/sys v0.0.0-20180125080817-ef802241c90f // indirect
46+
golang.org/x/text v0.0.0-20171024115504-6eab0e8f74e8 // indirect
47+
gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect
48+
gopkg.in/fsnotify.v1 v1.4.7 // indirect
49+
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect
50+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
51+
gopkg.in/yaml.v2 v2.2.1 // indirect
52+
)

go.sum

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
github.com/BurntSushi/toml v0.3.0 h1:e1/Ivsx3Z0FVTV0NSOv/aVgbUWyQuzj7DDnFblkRvsY=
2+
github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3+
github.com/azer/snakecase v0.0.0-20161028114325-c818dddafb5c h1:7zL0ljVI6ads5EFvx+Oq+uompnFBMJqtbuHvyobbJ1Q=
4+
github.com/azer/snakecase v0.0.0-20161028114325-c818dddafb5c/go.mod h1:iApMeoHF0YlMPzCwqH/d59E3w2s8SeO4rGK+iGClS8Y=
5+
github.com/cloudfoundry-community/gautocloud v0.0.0-20180511025038-6a958fd8ab8a h1:9k+Y3+bDWXT7yhQHDbpQn3PfN0McR95ndmMcYh/zWS8=
6+
github.com/cloudfoundry-community/gautocloud v0.0.0-20180511025038-6a958fd8ab8a/go.mod h1:cnolqUkC35qUrUe3ADirnJui6LOO3j0oSnSciH2V1OU=
7+
github.com/cloudfoundry-community/go-cfenv v1.17.0 h1:qfxEfn8qKkaHY3ZEk/Y2noY79HBASvNgmtHK9x4+6GY=
8+
github.com/cloudfoundry-community/go-cfenv v1.17.0/go.mod h1:2UgWvQTRXUuIZ/x3KnW6fk6CgPBhcV4UQb/UGIrUyyI=
9+
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
10+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11+
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
12+
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
13+
github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8=
14+
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
15+
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
16+
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
17+
github.com/hashicorp/hcl v0.0.0-20171017181929-23c074d0eceb h1:1OvvPvZkn/yCQ3xBcM8y4020wdkMXPHLB4+NfoGWh4U=
18+
github.com/hashicorp/hcl v0.0.0-20171017181929-23c074d0eceb/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
19+
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
20+
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
21+
github.com/influxdata/go-syslog v1.0.1 h1:a/ARpnCDr/sX/hVH7dyQVi+COXlEzM4bNIoolOfw99Y=
22+
github.com/influxdata/go-syslog v1.0.1/go.mod h1:zAVA46ROTGBUi5zyIJODjMJYJKy+ooglXp0X3LgoIUE=
23+
github.com/jeffail/gabs v1.1.0 h1:q3o/obhmWPAUxEXwMlJFvwaw2/zRz+BCsUx1TcxrBJA=
24+
github.com/jeffail/gabs v1.1.0/go.mod h1:4qEQtV3py87F/jKMCb//ZQXJDjJBK5FU2kxdcgxb4iU=
25+
github.com/joho/godotenv v1.2.0 h1:vGTvz69FzUFp+X4/bAkb0j5BoLC+9bpqTWY8mjhA9pc=
26+
github.com/joho/godotenv v1.2.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
27+
github.com/labstack/echo v0.0.0-20171223171103-b338075a0fc6 h1:c/xiiwAicwSUaVDcLCUqmCUpTGRe/X8nABJEHfy3Xlk=
28+
github.com/labstack/echo v0.0.0-20171223171103-b338075a0fc6/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
29+
github.com/labstack/gommon v0.0.0-20170925052817-57409ada9da0 h1:kcJPx2Ug9owxOsVfuXPCludLaIudyI57YQd6ocyrO4o=
30+
github.com/labstack/gommon v0.0.0-20170925052817-57409ada9da0/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
31+
github.com/loafoe/go-rabbitmq v0.0.0-20180514175928-38d20cd36836 h1:QZ0Lr+pEHe/dq35kk5anQAXloQ1S4inNyDaU27nEvlg=
32+
github.com/loafoe/go-rabbitmq v0.0.0-20180514175928-38d20cd36836/go.mod h1:DIswdvUbEcWwIyAs1KD+LL/ohAERrKNXDaWZjo/C68U=
33+
github.com/m4rw3r/uuid v1.0.0 h1:Gu+N0Arda2uc4fmkaDCy+9gopVICvPkwLoCMBiimIkk=
34+
github.com/m4rw3r/uuid v1.0.0/go.mod h1:3WKANKNmGWB1YcSR844W90Bxlomjft18SqJUIBH7pqk=
35+
github.com/magiconair/properties v1.7.6 h1:U+1DqNen04MdEPgFiIwdOUiqZ8qPa37xgogX/sd3+54=
36+
github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
37+
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
38+
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
39+
github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI=
40+
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
41+
github.com/mitchellh/mapstructure v0.0.0-20180111000720-b4575eea38cc h1:5T6hzGUO5OrL6MdYXYoLQtRWJDDgjdlOVBn9mIqGY1g=
42+
github.com/mitchellh/mapstructure v0.0.0-20180111000720-b4575eea38cc/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
43+
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
44+
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
45+
github.com/onsi/gomega v1.4.1 h1:PZSj/UFNaVp3KxrzHOcS7oyuWA7LoOY/77yCTEFu21U=
46+
github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
47+
github.com/pelletier/go-toml v1.1.0 h1:cmiOvKzEunMsAxyhXSzpL5Q1CRKpVv0KQsnAIcSEVYM=
48+
github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
49+
github.com/philips-software/go-hsdp-api v0.0.0-20180817111852-d97ac1de7ba2 h1:ZugVQcyD396s3JqyQ3dSCxDc8cJq+1xEJ8ipZ44ngWw=
50+
github.com/philips-software/go-hsdp-api v0.0.0-20180817111852-d97ac1de7ba2/go.mod h1:IXoGl6W+aa0BpQvkRadzHu9qc9ialJVCk9ZBxodOAM8=
51+
github.com/philips-software/go-hsdp-signer v1.0.0 h1:nhP9nDJvX7Obd4SAZ24Kut3qGn7K4X1Wd9Gq5E3dO6o=
52+
github.com/philips-software/go-hsdp-signer v1.0.0/go.mod h1:mtq3D20YNxHQ8e318ci9hVb3DW5Hlo30D3abN7VeqLM=
53+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
54+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
55+
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
56+
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
57+
github.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I=
58+
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
59+
github.com/spf13/afero v1.1.0 h1:bopulORc2JeYaxfHLvJa5NzxviA9PoWhpiiJkru7Ji4=
60+
github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
61+
github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg=
62+
github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
63+
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec h1:2ZXvIUGghLpdTVHR1UfvfrzoVlZaE/yOWC5LueIHZig=
64+
github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
65+
github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
66+
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
67+
github.com/spf13/viper v1.0.2 h1:Ncr3ZIuJn322w2k1qmzXDnkLAdQMlJqBa9kfAH+irso=
68+
github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
69+
github.com/streadway/amqp v0.0.0-20180118175716-54ded0531dfd h1:i76NWYGbWcy4FToCvWlyy8tK1gDwc4nmdwY1U2b1WWQ=
70+
github.com/streadway/amqp v0.0.0-20180118175716-54ded0531dfd/go.mod h1:1WNBiOZtZQLpVAyu0iTduoJL9hEsMloAK5XWrtW0xdY=
71+
github.com/stretchr/testify v1.1.4 h1:ToftOQTytwshuOSj6bDSolVUa3GINfJP/fg3OkkOzQQ=
72+
github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
73+
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
74+
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
75+
github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4 h1:gKMu1Bf6QINDnvyZuTaACm9ofY+PRh+5vFz4oxBZeF8=
76+
github.com/valyala/fasttemplate v0.0.0-20170224212429-dcecefd839c4/go.mod h1:50wTf68f99/Zt14pr046Tgt3Lp2vLyFZKzbFXTOabXw=
77+
golang.org/x/crypto v0.0.0-20180123095555-3d37316aaa6b h1:VqIuNRBMdkwj3QmFfZdCw5Mzlv4BFaMda+dzdi9gAIQ=
78+
golang.org/x/crypto v0.0.0-20180123095555-3d37316aaa6b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
79+
golang.org/x/net v0.0.0-20171024115130-4b14673ba32b h1:gLAd8PDHbxH9wEJTKja0iETNXqtTDcrjeSNA/4T8yb0=
80+
golang.org/x/net v0.0.0-20171024115130-4b14673ba32b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
81+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
82+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
83+
golang.org/x/sys v0.0.0-20180125080817-ef802241c90f h1:gmASKo/i8yeq+Itu4FLQ8TTEY+1D0o4viwnE/chaTYg=
84+
golang.org/x/sys v0.0.0-20180125080817-ef802241c90f/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
85+
golang.org/x/text v0.0.0-20171024115504-6eab0e8f74e8 h1:2gcGGuF4nEyr4ixGENyPhTZzb2uVF0Ehh9KfhqYcg6Q=
86+
golang.org/x/text v0.0.0-20171024115504-6eab0e8f74e8/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
87+
gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo=
88+
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
89+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
90+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
91+
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
92+
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
93+
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0=
94+
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
95+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
96+
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
97+
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
98+
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

handlers/health.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package handlers
2+
3+
import (
4+
"github.com/labstack/echo"
5+
)
6+
7+
type HealthHandler struct {
8+
}
9+
10+
type healthResponse struct {
11+
Status string `json:"status"`
12+
}
13+
14+
func (h HealthHandler) Handler() echo.HandlerFunc {
15+
return func(c echo.Context) error {
16+
response := &healthResponse{
17+
Status: "UP",
18+
}
19+
c.JSON(200, response)
20+
return nil
21+
}
22+
}

handlers/health_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package handlers
2+
3+
import (
4+
"net/http"
5+
"net/http/httptest"
6+
"testing"
7+
8+
"github.com/labstack/echo"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
var statusJSON = `{"status":"UP"}`
13+
14+
func TestHealth(t *testing.T) {
15+
// Setup
16+
e := echo.New()
17+
req := httptest.NewRequest(echo.GET, "/health", nil)
18+
rec := httptest.NewRecorder()
19+
c := e.NewContext(req, rec)
20+
healthHandler := &HealthHandler{}
21+
handler := healthHandler.Handler()
22+
23+
// Assertions
24+
if assert.NoError(t, handler(c)) {
25+
assert.Equal(t, http.StatusOK, rec.Code)
26+
assert.Equal(t, statusJSON, rec.Body.String())
27+
}
28+
}

0 commit comments

Comments
 (0)