├── .github └── workflows │ └── build-release.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── cloudmonitor_exporter.go ├── docs ├── akamai.md ├── akamai_cloudmonitor_sample.png ├── akamai_cloudmonitor_settings.png ├── akamai_new_property.png ├── akamai_site_property.png ├── docker-compose.md ├── grafana.png └── prometheus.png ├── go.mod ├── go.sum ├── package ├── rpm │ ├── build_rpm.sh │ └── cloudmonitor_exporter.spec └── sources │ ├── cloudmonitor_exporter.service │ └── cloudmonitor_exporter.sysconfig ├── setup ├── docker-compose.yml ├── grafana.json ├── grafana_data │ └── grafana.db ├── prometheus.yml └── setup.sh └── tests ├── localtest.sh └── payload.json /.github/workflows/build-release.yml: -------------------------------------------------------------------------------- 1 | name: Create Release 2 | on: 3 | release: 4 | types: 5 | - created 6 | jobs: 7 | build: 8 | name: Create Artifacts 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout Code 12 | uses: actions/checkout@master 13 | - name: Get Tag 14 | id: vars 15 | run: echo ::set-output name=tag::${GITHUB_REF#refs/*/} 16 | - name: Check Tag 17 | run: echo ${{ steps.vars.outputs.tag }} 18 | - name: Get ID 19 | uses: octokit/request-action@v2.x 20 | id: get_release_id 21 | with: 22 | route: GET /repos/${{ github.repository }}/releases/tags/${{ steps.vars.outputs.tag }} 23 | env: 24 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 25 | - name: Set ID 26 | id: set_id 27 | run: echo ::set-output name=release_id::${{ fromJson(steps.get_release_id.outputs.data).id }} 28 | - name: Install GO 29 | uses: actions/setup-go@v2 30 | with: 31 | go-version: '1.14' 32 | - name: Go Version 33 | run: go version 34 | - name: Go Environment 35 | run: go env 36 | - name: Build RPM 37 | run: VERSION=${{ steps.vars.outputs.tag }} make rpm 38 | - name: Upload RPM 39 | id: upload-rpm 40 | uses: actions/upload-release-asset@v1 41 | env: 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | with: 44 | upload_url: https://uploads.github.com/repos/ExpressenAB/cloudmonitor_exporter/releases/${{steps.set_id.outputs.release_id}}/assets{?name,label} 45 | asset_path: build/rpm/cloudmonitor_exporter-${{ steps.vars.outputs.tag }}-1.x86_64.rpm 46 | asset_name: cloudmonitor_exporter-${{ steps.vars.outputs.tag }}-1.x86_64.rpm 47 | asset_content_type: application/gzip 48 | - name: Upload Linux Tarball 49 | id: upload-linux-tgz 50 | uses: actions/upload-release-asset@v1 51 | env: 52 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 53 | with: 54 | upload_url: https://uploads.github.com/repos/ExpressenAB/cloudmonitor_exporter/releases/${{steps.set_id.outputs.release_id}}/assets{?name,label} 55 | asset_path: build/tgz/cloudmonitor_exporter_${{ steps.vars.outputs.tag }}_linux_amd64.tar.gz 56 | asset_name: cloudmonitor_exporter_${{ steps.vars.outputs.tag }}_linux_amd64.tar.gz 57 | asset_content_type: application/gzip 58 | - name: Upload Darwin Tarball 59 | id: upload-darwin-tgz 60 | uses: actions/upload-release-asset@v1 61 | env: 62 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 63 | with: 64 | upload_url: https://uploads.github.com/repos/ExpressenAB/cloudmonitor_exporter/releases/${{steps.set_id.outputs.release_id}}/assets{?name,label} 65 | asset_path: build/tgz/cloudmonitor_exporter_${{ steps.vars.outputs.tag }}_darwin_amd64.tar.gz 66 | asset_name: cloudmonitor_exporter_${{ steps.vars.outputs.tag }}_darwin_amd64.tar.gz 67 | asset_content_type: application/gzip 68 | - name: Upload Windows Tarball 69 | id: upload-windows-tgz 70 | uses: actions/upload-release-asset@v1 71 | env: 72 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 73 | with: 74 | upload_url: https://uploads.github.com/repos/ExpressenAB/cloudmonitor_exporter/releases/${{steps.set_id.outputs.release_id}}/assets{?name,label} 75 | asset_path: build/tgz/cloudmonitor_exporter_${{ steps.vars.outputs.tag }}_windows_amd64.tar.gz 76 | asset_name: cloudmonitor_exporter_${{ steps.vars.outputs.tag }}_windows_amd64.tar.gz 77 | asset_content_type: application/gzip 78 | - name: Build Image 79 | run: VERSION=${{ steps.vars.outputs.tag }} make docker 80 | - name: Login to docker hub 81 | run: docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password ${{ secrets.DOCKERHUB_PASSWORD }} 82 | - name: Push to docker hub 83 | run: docker push bonniernews/cloudmonitor_exporter:${{ steps.vars.outputs.tag }} 84 | - name: Tag image as latest 85 | run: docker tag bonniernews/cloudmonitor_exporter:${{ steps.vars.outputs.tag }} bonniernews/cloudmonitor_exporter:latest 86 | - name: Push latest image 87 | run: docker push bonniernews/cloudmonitor_exporter:latest 88 | 89 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Folders 2 | bin 3 | build 4 | .idea 5 | 6 | .DS_Store 7 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:latest 2 | ARG VERSION=0.0.0 3 | COPY "build/cloudmonitor_exporter_${VERSION}_linux_amd64/cloudmonitor_exporter" "/app/cloudmonitor_exporter" 4 | EXPOSE 9143 5 | CMD ["/app/cloudmonitor_exporter"] 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Expressen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | NAME=cloudmonitor_exporter 2 | 3 | ifndef VERSION 4 | VERSION=0.0.0 5 | endif 6 | 7 | COMMIT=$(shell git rev-parse HEAD) 8 | BRANCH=$(shell git rev-parse --abbrev-ref HEAD) 9 | BUILDER=$(shell whoami)@$(shell hostname) 10 | BUILD_DATE=$(shell date '+%F-%T%z') 11 | 12 | VERSION_PATH=github.com/prometheus/common/version 13 | LDFLAGS=-ldflags "-X ${VERSION_PATH}.Version=${VERSION} \ 14 | -X ${VERSION_PATH}.Revision=${COMMIT} \ 15 | -X ${VERSION_PATH}.Branch=${BRANCH} \ 16 | -X ${VERSION_PATH}.BuildUser=${BUILDER} \ 17 | -X ${VERSION_PATH}.BuildDate=${BUILD_DATE}" 18 | 19 | .PHONY: build clean rpm xbuild package 20 | 21 | build: 22 | @mkdir -p bin/ 23 | go build ${LDFLAGS} -o bin/${NAME} ${NAME}.go 24 | 25 | xbuild: clean 26 | @mkdir -p build 27 | CGO_ENABLED=0 GOARCH=amd64 GOOS="linux" go build ${LDFLAGS} -o "build/$(NAME)_$(VERSION)_linux_amd64/$(NAME)" 28 | CGO_ENABLED=0 GOARCH=amd64 GOOS="darwin" go build ${LDFLAGS} -o "build/$(NAME)_$(VERSION)_darwin_amd64/$(NAME)" 29 | CGO_ENABLED=0 GOARCH=amd64 GOOS="windows" go build ${LDFLAGS} -o "build/$(NAME)_$(VERSION)_windows_amd64/$(NAME)" 30 | 31 | package: xbuild 32 | $(eval FILES := $(shell ls build)) 33 | @mkdir -p build/tgz 34 | for f in $(FILES); do \ 35 | (cd $(shell pwd)/build && tar -zcvf tgz/$$f.tar.gz $$f); \ 36 | echo $$f; \ 37 | done 38 | 39 | clean: 40 | @rm -rf bin/ && rm -rf build/ 41 | 42 | rpm: package 43 | @mkdir -p build/rpm 44 | docker run --rm -i -v $(shell pwd):/docker centos:7 /docker/package/rpm/build_rpm.sh ${VERSION} 45 | 46 | docker: xbuild 47 | docker build --build-arg VERSION=${VERSION} . -t bonniernews/cloudmonitor_exporter:${VERSION} 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cloudmonitor exporter 2 | 3 | A Prometheus exporter that gathers [Akamai Cloudmonitor](https://www.akamai.com/us/en/solutions/intelligent-platform/cloud-monitor.jsp) statistics. 4 | 5 | Akamai Cloudmonitor aggregates client request/responses as JSON data and send them to cloudmonitor_exporter's `collector.endpoint`. Exporter will parse this and provide metrics on the `metrics.endpoint`. 6 | 7 | Detailed information about cloudmonitor can be found [Here](https://control.akamai.com/dl/customers/ALTA/Cloud-Monitor-Implementation.pdf) 8 | 9 | ### Status 10 | [![Build Status](https://travis-ci.org/ExpressenAB/cloudmonitor_exporter.svg)](https://travis-ci.org/ExpressenAB/cloudmonitor_exporter) 11 | 12 | ## Get it 13 | The latest version can be found under [Releases](https://github.com/ExpressenAB/cloudmonitor_exporter/releases). 14 | 15 | ## Usage 16 | Example: 17 | ``` 18 | ./cloudmonitor_exporter 19 | ``` 20 | 21 | ## Flags 22 | Flag | Description | Default 23 | -----|-------------|--------- 24 | -exporter.address | Exporter bind address:port | :9143 25 | -exporter.namespace | The namespace used in prometheus labels | cloudmonitor 26 | -metrics.endpoint | Metrics endpoint | /metrics 27 | -collector.endpoint | Collector endpoint | /collector 28 | -collector.accesslog | File to store accesslogs to | "" off 29 | 30 | ## Docker-compose 31 | 32 | An basic stack with grafana including the template below/prometheus/haproxy/cloudmonitor_exporter can be executed with docker-compose. Instructions can be found [Here](docs/docker-compose.md) 33 | 34 | ## Akamai setup 35 | 36 | Information about configuration of akamai properties, can be found [Here](docs/akamai.md) 37 | 38 | ## Prometheus 39 | 40 | When cloudmonitor properties/behaviors are active and data is retrieved we will be able to query prometheus. 41 | 42 | ![alt text](docs/prometheus.png "Prometheus") 43 | 44 | ## Grafana 45 | 46 | The following [Dashboard template](setup/grafana.json), can be imported into grafana to get an basic dashboard. 47 | 48 | Example: 49 | 50 | ![alt text](docs/grafana.png "Prometheus") 51 | -------------------------------------------------------------------------------- /cloudmonitor_exporter.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "encoding/json" 6 | "flag" 7 | "fmt" 8 | "log" 9 | "net" 10 | "net/http" 11 | "net/url" 12 | "os" 13 | "path" 14 | "strconv" 15 | "strings" 16 | "sync" 17 | "time" 18 | 19 | uasurfer "github.com/avct/user-agent-surfer" 20 | "github.com/prometheus/client_golang/prometheus" 21 | "github.com/prometheus/common/version" 22 | ) 23 | 24 | var ( 25 | listenAddress = flag.String("exporter.address", ":9143", "The address on which to expose the web interface and generated Prometheus metrics.") 26 | namespace = flag.String("exporter.namespace", "cloudmonitor", "The prometheus namespace.") 27 | metricsEndpoint = flag.String("metrics.endpoint", "/metrics", "Path under which to expose metrics.") 28 | collectorEndpoint = flag.String("collector.endpoint", "/collector", "Path under which to accept cloudmonitor data.") 29 | accesslog = flag.String("collector.accesslog", "", "Log incoming collector data to specified file.") 30 | logErrors = flag.Bool("collector.logerrors", false, "Log errors(5..) to stdout") 31 | showVersion = flag.Bool("version", false, "Show version information") 32 | ) 33 | 34 | type Exporter struct { 35 | sync.RWMutex 36 | httpRequestsTotal, httpDeviceRequestsTotal, httpResponseContentEncodingTotal, httpGeoRequestsTotal, httpResponseBytesTotal, httpResponseContentTypesTotal, parseErrorsTotal, originRetriesTotal *prometheus.CounterVec 37 | httpResponseLatency, httpOriginLatency *prometheus.SummaryVec 38 | postSizeBytesTotal prometheus.Counter 39 | postProcessingTime, logLatency prometheus.Summary 40 | logWriter *bufio.Writer 41 | logfile *os.File 42 | writeAccesslog, logErrors bool 43 | } 44 | 45 | type CloudmonitorStruct struct { 46 | Type string `json:"type"` 47 | Format string `json:"format"` 48 | Version string `json:"version"` 49 | ID string `json:"id"` 50 | Start string `json:"start"` 51 | CPCode string `json:"cp"` 52 | Message MessageStruct `json:"message"` 53 | Request RequestStruct `json:"reqHdr"` 54 | Response ResponseStruct `json:"respHdr"` 55 | Performance PerformanceStruct `json:"netPerf"` 56 | Network NetworkStruct `json:"network"` 57 | Geo GeoStruct `json:"geo"` 58 | } 59 | 60 | type GeoStruct struct { 61 | City string `json:"city"` 62 | Country string `json:"country"` 63 | Latitude string `json:"lat"` 64 | Longitude string `json:"long"` 65 | Region string `json:"region"` 66 | } 67 | 68 | type NetworkStruct struct { 69 | ASNum string `json:"asnum"` 70 | Network string `json:"network"` 71 | NetworkType string `json:"networkType"` 72 | EdgeIP string `json:"edgeIP"` 73 | } 74 | 75 | type PerformanceStruct struct { 76 | DownloadTime float64 `json:"downloadTime,string"` 77 | OriginName string `json:"originName"` 78 | OriginIP string `json:"originIP"` 79 | OriginInitIP string `json:"originInitIP"` 80 | OriginRetry int `json:"originRetry,string"` 81 | LastMileRTT string `json:"lastMileRTT"` 82 | MidMileLatency string `json:"midMileLatency"` 83 | OriginLatency float64 `json:"netOriginLatency,string"` 84 | LastMileBandwidth string `json:"lastMileBW"` 85 | CacheStatus int `json:"cacheStatus,string"` 86 | FirstByte string `json:"firstByte"` 87 | LastByte string `json:"lastByte"` 88 | ASNum string `json:"asnum"` 89 | Network string `json:"network"` 90 | NetworkType string `json:"netType"` 91 | EdgeIP string `json:"edgeIP"` 92 | } 93 | 94 | type MessageStruct struct { 95 | Protocol string `json:"proto"` 96 | ProtocolVersion string `json:"protoVer"` 97 | ClientIP string `json:"cliIP"` 98 | ReqPort string `json:"reqPort"` 99 | ReqHost string `json:"reqHost"` 100 | ReqMethod string `json:"reqMethod"` 101 | ReqPath string `json:"reqPath"` 102 | ReqQuery string `json:"reqQuery"` 103 | ReqContentType string `json:"reqCT"` 104 | ReqLength float64 `json:"reqLen"` 105 | SSLVer string `json:"sslVer"` 106 | ResStatus string `json:"status"` 107 | ResLocation string `json:"redirURL"` 108 | ResContentType string `json:"respCT"` 109 | ResLength float64 `json:"respLen,string"` 110 | ResBytes float64 `json:"bytes,string"` 111 | UserAgent string `json:"UA"` 112 | ForwardHost string `json:"fwdHost"` 113 | } 114 | 115 | type RequestStruct struct { 116 | AcceptEncoding string `json:"accEnc"` 117 | AcceptLanguage string `json:"accLang"` 118 | Authorization string `json:"auth"` 119 | CacheControl string `json:"cacheCtl"` 120 | Connection string `json:"conn"` 121 | MD5 string `json:"contMD5"` 122 | Cookie string `json:"cookie"` 123 | DNT string `json:"DNT"` 124 | Expect string `json:"expect"` 125 | IfMatch string `json:"ifMatch"` 126 | IfModifiedSince string `json:"ifMod"` 127 | IfNoneMatch string `json:"ifNone"` 128 | IfRange string `json:"ifRange"` 129 | IfUnmodifiedSince string `json:"ifUnmod"` 130 | Range string `json:"range"` 131 | Referer string `json:"referer"` 132 | TE string `json:"te"` 133 | Upgrade string `json:"upgrade"` 134 | Via string `json:"via"` 135 | XForwardedFor string `json:"xFrwdFor"` 136 | XRequestedWith string `json:"xReqWith"` 137 | } 138 | 139 | type ResponseStruct struct { 140 | AcceptRanges string `json:"accRange"` 141 | AccessControlAllowOrigin string `json:"allowOrigin"` 142 | Age string `json:"age"` 143 | Allow string `json:"allow"` 144 | CacheControl string `json:"cacheCtl"` 145 | Connection string `json:"conn"` 146 | ContentEncoding string `json:"contEnc"` 147 | ContentLanguage string `json:"contLang"` 148 | ContentMD5 string `json:"contMD5"` 149 | ContentDisposition string `json:"contDisp"` 150 | ContentRange string `json:"contRange"` 151 | Date string `json:"date"` 152 | ETag string `json:"eTag"` 153 | Expires string `json:"expires"` 154 | LastModified string `json:"lastMod"` 155 | Link string `json:"link"` 156 | P3P string `json:"p3p"` 157 | RetryAfter string `json:"retry"` 158 | Server string `json:"server"` 159 | Trailer string `json:"trailer"` 160 | TransferEncoding string `json:"transEnc"` 161 | Vary string `json:"vary"` 162 | Via string `json:"via"` 163 | Warning string `json:"warning"` 164 | WWWAuthenticate string `json:"wwwAuth"` 165 | XPoweredBy string `json:"xPwrdBy"` 166 | SetCookie string `json:"setCookie"` 167 | } 168 | 169 | func NewExporter(errors bool) *Exporter { 170 | return &Exporter{ 171 | writeAccesslog: false, 172 | logErrors: errors, 173 | httpRequestsTotal: prometheus.NewCounterVec( 174 | prometheus.CounterOpts{ 175 | Namespace: *namespace, 176 | Name: "http_requests_total", 177 | Help: "Total number of processed requests", 178 | }, 179 | []string{"host", "method", "status_code", "cache", "protocol", "protocol_version", "ip_version"}, 180 | ), 181 | httpDeviceRequestsTotal: prometheus.NewCounterVec( 182 | prometheus.CounterOpts{ 183 | Namespace: *namespace, 184 | Name: "http_device_requests_total", 185 | Help: "Total number of processed requests by devices", 186 | }, 187 | []string{"host", "device", "cache", "protocol", "protocol_version", "ip_version"}, 188 | ), 189 | httpGeoRequestsTotal: prometheus.NewCounterVec( 190 | prometheus.CounterOpts{ 191 | Namespace: *namespace, 192 | Name: "http_geo_requests_total", 193 | Help: "Total number of processed requests by country", 194 | }, 195 | []string{"host", "country", "ip_version"}, 196 | ), 197 | httpResponseBytesTotal: prometheus.NewCounterVec( 198 | prometheus.CounterOpts{ 199 | Namespace: *namespace, 200 | Name: "http_response_bytes_total", 201 | Help: "Total response size in bytes", 202 | }, 203 | []string{"host", "method", "status_code", "cache", "protocol", "protocol_version"}, 204 | ), 205 | httpResponseContentEncodingTotal: prometheus.NewCounterVec( 206 | prometheus.CounterOpts{ 207 | Namespace: *namespace, 208 | Name: "http_response_content_encoding_total", 209 | Help: "Counter of response content encodig", 210 | }, 211 | []string{"host", "encoding", "content_type"}, 212 | ), 213 | httpResponseContentTypesTotal: prometheus.NewCounterVec( 214 | prometheus.CounterOpts{ 215 | Namespace: *namespace, 216 | Name: "http_response_content_types_total", 217 | Help: "Counter of response content types", 218 | }, 219 | []string{"host", "cache", "content_type"}, 220 | ), 221 | httpResponseLatency: prometheus.NewSummaryVec( 222 | prometheus.SummaryOpts{ 223 | Namespace: *namespace, 224 | Name: "http_response_latency_milliseconds", 225 | Help: "Response latency in milliseconds", 226 | }, 227 | []string{"host", "cache", "protocol", "protocol_version", "ip_version"}, 228 | ), 229 | httpOriginLatency: prometheus.NewSummaryVec( 230 | prometheus.SummaryOpts{ 231 | Namespace: *namespace, 232 | Name: "http_origin_latency_milliseconds", 233 | Help: "Origin latency in milliseconds", 234 | }, 235 | []string{"host", "cache", "protocol", "protocol_version", "ip_version"}, 236 | ), 237 | logLatency: prometheus.NewSummary( 238 | prometheus.SummaryOpts{ 239 | Namespace: *namespace, 240 | Name: "log_latency_seconds", 241 | Help: "Summary of latency of incoming logs", 242 | }, 243 | ), 244 | originRetriesTotal: prometheus.NewCounterVec( 245 | prometheus.CounterOpts{ 246 | Namespace: *namespace, 247 | Name: "origin_retries_total", 248 | Help: "Number of origin retries", 249 | }, 250 | []string{"host", "status_code", "protocol", "ip_version"}, 251 | ), 252 | parseErrorsTotal: prometheus.NewCounterVec( 253 | prometheus.CounterOpts{ 254 | Namespace: *namespace, 255 | Name: "parse_errors_total", 256 | Help: "Number of detected parse errors", 257 | }, 258 | []string{"error"}, 259 | ), 260 | postProcessingTime: prometheus.NewSummary( 261 | prometheus.SummaryOpts{ 262 | Namespace: *namespace, 263 | Name: "post_processing_time_seconds", 264 | Help: "Seconds to process post", 265 | }, 266 | ), 267 | postSizeBytesTotal: prometheus.NewCounter( 268 | prometheus.CounterOpts{ 269 | Namespace: *namespace, 270 | Name: "post_size_bytes_total", 271 | Help: "Size of incoming postdata in bytes", 272 | }, 273 | ), 274 | } 275 | } 276 | 277 | func (e *Exporter) Collect(ch chan<- prometheus.Metric) { 278 | e.httpRequestsTotal.Collect(ch) 279 | e.httpDeviceRequestsTotal.Collect(ch) 280 | e.httpResponseContentEncodingTotal.Collect(ch) 281 | e.httpGeoRequestsTotal.Collect(ch) 282 | e.httpResponseBytesTotal.Collect(ch) 283 | e.httpResponseContentTypesTotal.Collect(ch) 284 | e.originRetriesTotal.Collect(ch) 285 | e.parseErrorsTotal.Collect(ch) 286 | e.httpResponseLatency.Collect(ch) 287 | e.httpOriginLatency.Collect(ch) 288 | 289 | ch <- e.postProcessingTime 290 | ch <- e.logLatency 291 | ch <- e.postSizeBytesTotal 292 | } 293 | 294 | func (e *Exporter) Describe(ch chan<- *prometheus.Desc) { 295 | e.httpRequestsTotal.Describe(ch) 296 | e.httpDeviceRequestsTotal.Describe(ch) 297 | e.httpResponseContentEncodingTotal.Describe(ch) 298 | e.httpGeoRequestsTotal.Describe(ch) 299 | e.httpResponseBytesTotal.Describe(ch) 300 | e.httpResponseContentTypesTotal.Describe(ch) 301 | e.originRetriesTotal.Describe(ch) 302 | e.parseErrorsTotal.Describe(ch) 303 | e.httpResponseLatency.Describe(ch) 304 | e.httpOriginLatency.Describe(ch) 305 | 306 | ch <- e.postProcessingTime.Desc() 307 | ch <- e.logLatency.Desc() 308 | ch <- e.postSizeBytesTotal.Desc() 309 | } 310 | 311 | func (e *Exporter) UnescapeString(s string) string { 312 | o, err := url.QueryUnescape(s) 313 | 314 | if err != nil { 315 | return "" 316 | } 317 | 318 | return o 319 | } 320 | 321 | func (e *Exporter) GetCacheString(i int) string { 322 | switch i { 323 | case 0: 324 | return "notcachable" 325 | case 1, 2: 326 | return "hit" 327 | case 3: 328 | return "miss" 329 | } 330 | 331 | return "-" 332 | } 333 | 334 | func (e *Exporter) Close() error { 335 | return e.logfile.Close() 336 | } 337 | 338 | func (e *Exporter) SetLogfile(logpath string) { 339 | if len(logpath) <= 0 { 340 | return 341 | } 342 | 343 | var err error 344 | 345 | e.logfile, err = os.OpenFile(logpath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) 346 | if err != nil { 347 | panic(err) 348 | } 349 | 350 | e.logWriter = bufio.NewWriter(e.logfile) 351 | e.writeAccesslog = true 352 | } 353 | 354 | func (e *Exporter) createLogEntry(cloudmonitorData *CloudmonitorStruct, query string) string { 355 | return fmt.Sprintf("%s %s %s \"%s %s://%s%s%s %s HTTP/%s\" %s %v '%s'\n", 356 | cloudmonitorData.Message.ClientIP, 357 | cloudmonitorData.Network.EdgeIP, 358 | e.MillisecondsToTime(cloudmonitorData.Start), 359 | cloudmonitorData.Message.ReqMethod, 360 | cloudmonitorData.Message.Protocol, 361 | cloudmonitorData.Message.ReqHost, 362 | e.UnescapeString(cloudmonitorData.Message.ReqPath), 363 | e.UnescapeString(query), 364 | cloudmonitorData.Message.ResStatus, 365 | cloudmonitorData.Message.ProtocolVersion, 366 | e.GetCacheString(cloudmonitorData.Performance.CacheStatus), 367 | cloudmonitorData.Message.ResBytes, 368 | e.UnescapeString(cloudmonitorData.Message.UserAgent)) 369 | } 370 | 371 | func (e *Exporter) OutputLogEntry(cloudmonitorData *CloudmonitorStruct) { 372 | query := "" 373 | 374 | if len(cloudmonitorData.Message.ReqQuery) > 0 { 375 | query = "?" + cloudmonitorData.Message.ReqQuery 376 | } 377 | 378 | logentry := e.createLogEntry(cloudmonitorData, query) 379 | 380 | if e.writeAccesslog == true { 381 | fmt.Fprintf(e.logWriter, logentry) 382 | } 383 | 384 | if e.logErrors { 385 | status, _ := strconv.Atoi(cloudmonitorData.Message.ResStatus) 386 | if status >= 500 && status <= 599 { 387 | fmt.Printf(logentry) 388 | } 389 | } 390 | } 391 | 392 | func (e *Exporter) DummyUse(vals ...interface{}) { 393 | for _, val := range vals { 394 | _ = val 395 | } 396 | } 397 | 398 | func (e *Exporter) GetDeviceType(userAgent string) string { 399 | 400 | ua := uasurfer.Parse(userAgent) 401 | 402 | switch ua.DeviceType { 403 | case uasurfer.DeviceComputer: 404 | return "desktop" 405 | case uasurfer.DevicePhone: 406 | return "mobile" 407 | case uasurfer.DeviceTablet: 408 | return "tablet" 409 | case uasurfer.DeviceTV: 410 | return "tv" 411 | case uasurfer.DeviceConsole: 412 | return "console" 413 | case uasurfer.DeviceWearable: 414 | return "wearable" 415 | default: 416 | return "unknown" 417 | } 418 | } 419 | 420 | func (e *Exporter) MillisecondsToTime(ms string) time.Time { 421 | i, err := strconv.ParseFloat(ms, 64) 422 | if err != nil { 423 | return time.Now() 424 | } 425 | return time.Unix(int64(i), 0) 426 | } 427 | 428 | func (e *Exporter) ReportParseError(error string) { 429 | e.parseErrorsTotal.WithLabelValues(error).Inc() 430 | } 431 | 432 | func getIPVersion(ip_s string) string { 433 | ip := net.ParseIP(ip_s) 434 | if ip.To4() != nil { 435 | return "ipv4" 436 | } else if ip.To16() != nil { 437 | return "ipv6" 438 | } else { 439 | return "unknown" 440 | } 441 | } 442 | 443 | func (e *Exporter) HandleCollectorPost(w http.ResponseWriter, r *http.Request) { 444 | if r.Method != "POST" { 445 | http.Error(w, "Internal server error", http.StatusMethodNotAllowed) 446 | return 447 | } 448 | 449 | var multiplier float64 = float64(1) 450 | dir, file := path.Split(r.URL.Path) 451 | if dir != "" && path.Base(dir) == "sample-percentage" { 452 | if sample, err := strconv.Atoi(file); err != nil || sample == 0 { 453 | http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) 454 | } else { 455 | multiplier = float64(100 / sample) 456 | } 457 | } 458 | 459 | e.postSizeBytesTotal.Add(float64(r.ContentLength)) 460 | 461 | begin := time.Now() 462 | 463 | scanner := bufio.NewScanner(r.Body) 464 | defer r.Body.Close() 465 | 466 | for scanner.Scan() { 467 | 468 | cloudmonitorData := &CloudmonitorStruct{} 469 | 470 | if err := json.NewDecoder(strings.NewReader(scanner.Text())).Decode(cloudmonitorData); err != nil { 471 | e.ReportParseError(err.Error()) 472 | log.Printf("Could not parse message %q (%v)\n", scanner.Text(), err) 473 | continue 474 | } 475 | 476 | ipVersion := getIPVersion(cloudmonitorData.Message.ClientIP) 477 | 478 | e.OutputLogEntry(cloudmonitorData) 479 | 480 | e.httpRequestsTotal.WithLabelValues( 481 | cloudmonitorData.Message.ReqHost, 482 | cloudmonitorData.Message.ReqMethod, 483 | string(cloudmonitorData.Message.ResStatus), 484 | e.GetCacheString(cloudmonitorData.Performance.CacheStatus), 485 | cloudmonitorData.Message.Protocol, 486 | cloudmonitorData.Message.ProtocolVersion, 487 | ipVersion, 488 | ).Add(multiplier) 489 | 490 | deviceType := e.GetDeviceType(e.UnescapeString(cloudmonitorData.Message.UserAgent)) 491 | 492 | e.httpDeviceRequestsTotal.WithLabelValues( 493 | cloudmonitorData.Message.ReqHost, 494 | deviceType, 495 | e.GetCacheString(cloudmonitorData.Performance.CacheStatus), 496 | cloudmonitorData.Message.Protocol, 497 | cloudmonitorData.Message.ProtocolVersion, 498 | ipVersion, 499 | ).Add(multiplier) 500 | 501 | // Don't increment for non-defined content-types 502 | if cloudmonitorData.Message.ResContentType != "" && cloudmonitorData.Message.ResContentType != "content_type" { 503 | e.httpResponseContentEncodingTotal.WithLabelValues( 504 | cloudmonitorData.Message.ReqHost, 505 | strings.ToLower(string(cloudmonitorData.Response.ContentEncoding)), 506 | strings.ToLower(string(cloudmonitorData.Message.ResContentType)), 507 | ).Add(multiplier) 508 | 509 | e.httpResponseContentTypesTotal.WithLabelValues( 510 | cloudmonitorData.Message.ReqHost, 511 | e.GetCacheString(cloudmonitorData.Performance.CacheStatus), 512 | strings.ToLower(string(cloudmonitorData.Message.ResContentType)), 513 | ).Add(multiplier) 514 | } 515 | 516 | e.httpResponseBytesTotal.WithLabelValues( 517 | cloudmonitorData.Message.ReqHost, 518 | cloudmonitorData.Message.ReqMethod, 519 | string(cloudmonitorData.Message.ResStatus), 520 | e.GetCacheString(cloudmonitorData.Performance.CacheStatus), 521 | cloudmonitorData.Message.Protocol, 522 | cloudmonitorData.Message.ProtocolVersion, 523 | ).Add(cloudmonitorData.Message.ResBytes * multiplier) 524 | 525 | e.httpGeoRequestsTotal.WithLabelValues( 526 | cloudmonitorData.Message.ReqHost, 527 | cloudmonitorData.Geo.Country, 528 | ipVersion, 529 | ).Add(multiplier) 530 | 531 | e.httpResponseLatency.WithLabelValues( 532 | cloudmonitorData.Message.ReqHost, 533 | e.GetCacheString(cloudmonitorData.Performance.CacheStatus), 534 | cloudmonitorData.Message.Protocol, 535 | cloudmonitorData.Message.ProtocolVersion, 536 | ipVersion, 537 | ).Observe(cloudmonitorData.Performance.DownloadTime) 538 | 539 | e.httpOriginLatency.WithLabelValues( 540 | cloudmonitorData.Message.ReqHost, 541 | e.GetCacheString(cloudmonitorData.Performance.CacheStatus), 542 | cloudmonitorData.Message.Protocol, 543 | cloudmonitorData.Message.ProtocolVersion, 544 | ipVersion, 545 | ).Observe(cloudmonitorData.Performance.OriginLatency) 546 | 547 | latency := time.Since(e.MillisecondsToTime(cloudmonitorData.Start)) 548 | e.logLatency.Observe(latency.Seconds()) 549 | 550 | e.originRetriesTotal.WithLabelValues( 551 | cloudmonitorData.Message.ReqHost, 552 | string(cloudmonitorData.Message.ResStatus), 553 | cloudmonitorData.Message.Protocol, 554 | ipVersion, 555 | ).Add(float64(cloudmonitorData.Performance.OriginRetry) * multiplier) 556 | } 557 | 558 | duration := time.Since(begin) 559 | e.postProcessingTime.Observe(duration.Seconds()) 560 | 561 | if e.writeAccesslog { 562 | e.logWriter.Flush() 563 | } 564 | 565 | } 566 | 567 | func main() { 568 | 569 | flag.Parse() 570 | 571 | log.Printf("Cloudmonitor-exporter %s\n", version.Print("cloudmonitor_exporter")) 572 | if *showVersion { 573 | return 574 | } 575 | 576 | exporter := NewExporter(*logErrors) 577 | defer exporter.Close() 578 | 579 | if len(*accesslog) > 0 { 580 | exporter.SetLogfile(*accesslog) 581 | log.Printf("logging to %s", *accesslog) 582 | } 583 | 584 | prometheus.MustRegister(version.NewCollector("cloudmonitor_exporter")) 585 | prometheus.MustRegister(exporter) 586 | 587 | if !strings.HasSuffix(*collectorEndpoint, "/") { 588 | endpointWithSlash := fmt.Sprintf("%v/", *collectorEndpoint) 589 | http.HandleFunc(endpointWithSlash, exporter.HandleCollectorPost) 590 | } 591 | 592 | http.Handle(*metricsEndpoint, prometheus.Handler()) 593 | http.HandleFunc(*collectorEndpoint, exporter.HandleCollectorPost) 594 | 595 | log.Printf("providing metrics at %s%s", *listenAddress, *metricsEndpoint) 596 | log.Printf("accepting logs at at %s%s", *listenAddress, *collectorEndpoint) 597 | 598 | log.Fatal(http.ListenAndServe(*listenAddress, nil)) 599 | } 600 | -------------------------------------------------------------------------------- /docs/akamai.md: -------------------------------------------------------------------------------- 1 | # Akamai setup 2 | 3 | To be able to retrieve data from akamai we need to perform the following steps: 4 | * Create an cloudmonitor property 5 | * Add an cloudmonitor behavior to every property you want to export data from 6 | 7 | ## Cloudmonitor property 8 | 9 | In the cloudmonitor property we define to which endpoint you want to send the data. 10 | (More detailed instruction can be found at [Akamai site](https://control.akamai.com/dl/customers/ALTA/Cloud-Monitor-Implementation.pdf)) 11 | 12 | Create an property of the type "Cloud monitor data delivery" 13 | 14 | ![alt text](akamai_new_property.png "Akamai cloudmonitor property") 15 | 16 | Basic settings of an cloudmonitor property: 17 | 18 | ![alt text](akamai_cloudmonitor_settings.png "Akamai cloudmonitor settings") 19 | 20 | 21 | ## Site property 22 | 23 | To enable cloudmonitor on your site properties, just add cloudmonitor behavior with correct parameters. 24 | 25 | ![alt text](akamai_site_property.png "Akamai behavior") 26 | 27 | ## Sampling of Cloudmonitor data 28 | 29 | On a very busy property, it might not be necessary with very detailed data, since it will result in a high log bandwith and associated costs. If you are willing to accept some inaccuracy, you can enable sampling of cloudmonitor data. This is done in two steps: 30 | * Set a criteria on the Cloudmonitor rule 31 | * Set a matching sample rate as a parameter in the delivery url path on the Cloudmonitor behavior 32 | 33 | ![alt text](akamai_cloudmonitor_sample.png "Akamai behavior with sampling") -------------------------------------------------------------------------------- /docs/akamai_cloudmonitor_sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExpressenAB/cloudmonitor_exporter/3bd8698de697dcd58ea2f712485d083eaf879e5a/docs/akamai_cloudmonitor_sample.png -------------------------------------------------------------------------------- /docs/akamai_cloudmonitor_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExpressenAB/cloudmonitor_exporter/3bd8698de697dcd58ea2f712485d083eaf879e5a/docs/akamai_cloudmonitor_settings.png -------------------------------------------------------------------------------- /docs/akamai_new_property.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExpressenAB/cloudmonitor_exporter/3bd8698de697dcd58ea2f712485d083eaf879e5a/docs/akamai_new_property.png -------------------------------------------------------------------------------- /docs/akamai_site_property.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExpressenAB/cloudmonitor_exporter/3bd8698de697dcd58ea2f712485d083eaf879e5a/docs/akamai_site_property.png -------------------------------------------------------------------------------- /docs/docker-compose.md: -------------------------------------------------------------------------------- 1 | ### Basic setup with docker-compose 2 | 3 | Docker-compose can be used to setup an small stack with prometheus/grafana/haproxy/cloudmonitor_exporter. 4 | 5 | ## Instructions 6 | * Make sure docker engine is installed ([instructions](https://docs.docker.com/engine/installation/)) 7 | * Make sure docker compose is installed ([instructions](https://docs.docker.com/compose/install/)) 8 | * Clone repository 9 | 10 | `git clone https://github.com/ExpressenAB/cloudmonitor_exporter.git` 11 | * Create self-signed certificate by running setup.sh 12 | ``` 13 | > cd cloudmonitor_exporter/setup 14 | > ./setup.sh 15 | This will generate a self-signed certificate to use with cloudmonitor_exporter 16 | Enter companyname for certificate: 17 | ...... 18 | ``` 19 | * Start containers by running `docker-compose up` 20 | 21 | Now we have 4 docker containers running with: 22 | * cloudmonitor_exporter listening on :9143 23 | * haproxy listening on 443 with self-signed certificate for ssl termination 24 | * prometheus scraping localhost:9143 25 | * grafana using prometheus datasource from localhost:9090 26 | 27 | ## Test stack 28 | 29 | The stack can now be tested by running localtest.sh under `tests` 30 | ``` 31 | cd tests 32 | ./localtest.sh 33 | ``` 34 | 35 | Now visit local [grafana](http://localhost:3000) instance and login with admin/admin 36 | -------------------------------------------------------------------------------- /docs/grafana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExpressenAB/cloudmonitor_exporter/3bd8698de697dcd58ea2f712485d083eaf879e5a/docs/grafana.png -------------------------------------------------------------------------------- /docs/prometheus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExpressenAB/cloudmonitor_exporter/3bd8698de697dcd58ea2f712485d083eaf879e5a/docs/prometheus.png -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/ExpressenAB/cloudmonitor_exporter 2 | 3 | go 1.14 4 | 5 | require ( 6 | github.com/avct/user-agent-surfer v0.0.0-20161222105459-0553e2066a8f 7 | github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a 8 | github.com/golang/protobuf v0.0.0-20170217234432-69b215d01a56 9 | github.com/matttproud/golang_protobuf_extensions v1.0.1 10 | github.com/prometheus/client_golang v0.8.1-0.20170228162001-aace68cde27d 11 | github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612 12 | github.com/prometheus/common v0.0.0-20170830190555-bc8b88226a12 13 | github.com/prometheus/procfs v0.0.0-20170216223256-a1dba9ce8bae 14 | ) 15 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/avct/user-agent-surfer v0.0.0-20161222105459-0553e2066a8f h1:R0RHkW2Sb9givQatqxi6r3KT3JFnVUuNqW3D7wtiEfk= 2 | github.com/avct/user-agent-surfer v0.0.0-20161222105459-0553e2066a8f/go.mod h1:8dgfQ+k4uiAvE0K9En3N1S9EQ3UgPIJ53pKjKIQMBaE= 3 | github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a h1:BtpsbiV638WQZwhA98cEZw2BsbnQJrbd0BI7tsy0W1c= 4 | github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 5 | github.com/golang/protobuf v0.0.0-20170217234432-69b215d01a56 h1:i2EQlrDjHdBwt1vVWTmCCw9scBgrSxxF/KWs//OHQcY= 6 | github.com/golang/protobuf v0.0.0-20170217234432-69b215d01a56/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 7 | github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= 8 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 9 | github.com/prometheus/client_golang v0.8.1-0.20170228162001-aace68cde27d h1:WeA/Z6ZbQu6fYvR6BZMOf+s3syHWkNfkBb4Ds1w3+tU= 10 | github.com/prometheus/client_golang v0.8.1-0.20170228162001-aace68cde27d/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 11 | github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612 h1:13pIdM2tpaDi4OVe24fgoIS7ZTqMt0QI+bwQsX5hq+g= 12 | github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 13 | github.com/prometheus/common v0.0.0-20170830190555-bc8b88226a12 h1:HNF6jAkmGi59kDBqYDDt5i6luIKlEWGOKEfel2vLRBY= 14 | github.com/prometheus/common v0.0.0-20170830190555-bc8b88226a12/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 15 | github.com/prometheus/procfs v0.0.0-20170216223256-a1dba9ce8bae h1:nbLP9B5vU3a/0hOXzolmZHxr2SQ2MEu6vhZappUZY9c= 16 | github.com/prometheus/procfs v0.0.0-20170216223256-a1dba9ce8bae/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 17 | -------------------------------------------------------------------------------- /package/rpm/build_rpm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | os=$(uname) 3 | os=${os,,} 4 | arch=$(uname -m) 5 | [[ $arch == "x86_64" ]] && arch="amd64" 6 | 7 | package="cloudmonitor_exporter" 8 | echo "Provisioning started, installing packages..." 9 | yum -y install rpmdevtools mock 10 | 11 | echo "Setting up rpm dev tree..." 12 | rpmdev-setuptree 13 | 14 | echo "Copying files for build..." 15 | cp /docker/package/rpm/$package.spec $HOME/rpmbuild/SPECS/ 16 | find /docker/package/sources -type f -exec cp -f {} $HOME/rpmbuild/SOURCES/ \; 17 | cp /docker/build/${package}_${1}_${os}_${arch}/${package} $HOME/rpmbuild/SOURCES/${package} 18 | cd ${HOME} 19 | chown -R root:root rpmbuild 20 | echo "Downloading dependencies..." 21 | spectool -g -R rpmbuild/SPECS/$package.spec 22 | 23 | echo "Building rpm..." 24 | rpmbuild -ba --define "_version ${1}" rpmbuild/SPECS/$package.spec 25 | 26 | echo "Copying rpms back to build folder...." 27 | cp -f ${HOME}/rpmbuild/RPMS/x86_64/*.rpm /docker/build/rpm/ 28 | chmod 777 /docker/build/rpm/* 29 | 30 | echo "Successfully built RPM for version ${1}:" 31 | ls -altrh /docker/build/rpm/ 32 | exit 0 -------------------------------------------------------------------------------- /package/rpm/cloudmonitor_exporter.spec: -------------------------------------------------------------------------------- 1 | Name: cloudmonitor_exporter 2 | Version: %{_version} 3 | Release: 1 4 | Summary: Prometheus exporter for Akamai Cloudmonitor. 5 | Group: System Environment/Daemons 6 | License: Apache Software License 7 | URL: https://github.com/ExpressenAB/cloudmonitor_exporter 8 | Source0: %{name} 9 | Source1: %{name}.service 10 | Source2: %{name}.sysconfig 11 | BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) 12 | 13 | %description 14 | Prometheus exporter for Akamai Cloudmonitor. 15 | 16 | %install 17 | mkdir -p %{buildroot}/%{_sbindir} 18 | cp %{SOURCE0} %{buildroot}/%{_sbindir}/%{name} 19 | 20 | mkdir -p %{buildroot}/%{_sysconfdir}/sysconfig 21 | cp %{SOURCE2} %{buildroot}/%{_sysconfdir}/sysconfig/%{name} 22 | 23 | mkdir -p %{buildroot}/%{_unitdir} 24 | cp %{SOURCE1} %{buildroot}/%{_unitdir}/ 25 | 26 | %post 27 | %systemd_post %{name}.service 28 | 29 | %preun 30 | %systemd_preun %{name}.service 31 | 32 | %postun 33 | %systemd_postun_with_restart %{name}.service 34 | 35 | %clean 36 | rm -rf %{buildroot} 37 | 38 | 39 | %files 40 | %defattr(-,root,root,-) 41 | %config(noreplace) %{_sysconfdir}/sysconfig/%{name} 42 | %{_unitdir}/%{name}.service 43 | %attr(755, root, root) %{_sbindir}/* 44 | 45 | %doc 46 | 47 | 48 | %changelog 49 | * Mon Dec 4 2016 Rickard Karlsson 50 | - Release 0.1.3 51 | -------------------------------------------------------------------------------- /package/sources/cloudmonitor_exporter.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Cloudmonitor_exporter 3 | Documentation=https://github.com/ExpressenAB/cloudmonitor_exporter/ 4 | After=network-online.target 5 | Wants=network-online.target 6 | 7 | [Service] 8 | EnvironmentFile=-/etc/sysconfig/cloudmonitor_exporter 9 | ExecStart=/usr/sbin/cloudmonitor_exporter $CMD_OPTS 10 | ExecReload=/bin/kill -HUP $MAINPID 11 | KillSignal=SIGINT 12 | Restart=on-failure 13 | 14 | [Install] 15 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /package/sources/cloudmonitor_exporter.sysconfig: -------------------------------------------------------------------------------- 1 | # 2 | # Add specific environment variables here for cloudmonitor_exporter 3 | # -------------------------------------------------------------------------------- /setup/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | volumes: 3 | prometheus_data: {} 4 | grafana_data: {} 5 | 6 | services: 7 | prometheus: 8 | image: prom/prometheus 9 | container_name: prometheus 10 | volumes: 11 | - ./prometheus.yml:/etc/prometheus/prometheus.yml 12 | - ./prometheus_data:/prometheus 13 | command: 14 | - '-config.file=/etc/prometheus/prometheus.yml' 15 | - '-storage.local.path=/prometheus' 16 | expose: 17 | - 9090 18 | links: 19 | - cloudmonitor:cloudmonitor 20 | ports: 21 | - 9090:9090 22 | 23 | grafana: 24 | image: grafana/grafana 25 | depends_on: 26 | - prometheus 27 | ports: 28 | - 3000:3000 29 | volumes: 30 | - ./grafana_data:/var/lib/grafana 31 | 32 | lb: 33 | image: dockercloud/haproxy 34 | links: 35 | - cloudmonitor 36 | environment: 37 | - CERT_FOLDER="/certs/" 38 | volumes: 39 | - /var/run/docker.sock:/var/run/docker.sock 40 | - ./cert.pem:/certs/cert1.pem 41 | ports: 42 | - 80:80 43 | - 443:443 44 | 45 | cloudmonitor: 46 | build: .. 47 | expose: 48 | - 9143 49 | ports: 50 | - "9143:9143" 51 | 52 | -------------------------------------------------------------------------------- /setup/grafana.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [] 4 | }, 5 | "editable": true, 6 | "gnetId": null, 7 | "graphTooltip": 0, 8 | "hideControls": false, 9 | "id": 1, 10 | "links": [], 11 | "rows": [ 12 | { 13 | "collapse": false, 14 | "height": "100px", 15 | "panels": [ 16 | { 17 | "cacheTimeout": null, 18 | "colorBackground": false, 19 | "colorValue": false, 20 | "colors": [ 21 | "rgba(245, 54, 54, 0.9)", 22 | "rgba(237, 129, 40, 0.89)", 23 | "rgba(50, 172, 45, 0.97)" 24 | ], 25 | "datasource": "prom", 26 | "editable": true, 27 | "error": false, 28 | "format": "percentunit", 29 | "gauge": { 30 | "maxValue": 100, 31 | "minValue": 0, 32 | "show": false, 33 | "thresholdLabels": false, 34 | "thresholdMarkers": true 35 | }, 36 | "hideTimeOverride": true, 37 | "id": 4, 38 | "interval": null, 39 | "links": [], 40 | "mappingType": 1, 41 | "mappingTypes": [ 42 | { 43 | "name": "value to text", 44 | "value": 1 45 | }, 46 | { 47 | "name": "range to text", 48 | "value": 2 49 | } 50 | ], 51 | "maxDataPoints": 100, 52 | "nullPointMode": "connected", 53 | "nullText": null, 54 | "postfix": "", 55 | "postfixFontSize": "50%", 56 | "prefix": "", 57 | "prefixFontSize": "50%", 58 | "rangeMaps": [ 59 | { 60 | "from": "null", 61 | "text": "N/A", 62 | "to": "null" 63 | } 64 | ], 65 | "span": 2, 66 | "sparkline": { 67 | "fillColor": "rgba(31, 118, 189, 0.18)", 68 | "full": false, 69 | "lineColor": "rgb(31, 120, 193)", 70 | "show": true 71 | }, 72 | "targets": [ 73 | { 74 | "expr": "(1.0-(sum(irate(cloudmonitor_http_response_bytes_total{host=~\"$host\",cache=~\"(notcachable|miss)\"}[5m]))/sum(irate(cloudmonitor_http_response_bytes_total{host=~\"$host\",cache=\"hit\"}[5m]))))", 75 | "interval": "", 76 | "intervalFactor": 2, 77 | "refId": "A", 78 | "step": 4 79 | } 80 | ], 81 | "thresholds": "", 82 | "timeFrom": "5m", 83 | "title": "Origin volume offload", 84 | "type": "singlestat", 85 | "valueFontSize": "80%", 86 | "valueMaps": [ 87 | { 88 | "op": "=", 89 | "text": "N/A", 90 | "value": "null" 91 | } 92 | ], 93 | "valueName": "avg" 94 | }, 95 | { 96 | "cacheTimeout": null, 97 | "colorBackground": false, 98 | "colorValue": false, 99 | "colors": [ 100 | "rgba(245, 54, 54, 0.9)", 101 | "rgba(237, 129, 40, 0.89)", 102 | "rgba(50, 172, 45, 0.97)" 103 | ], 104 | "datasource": "prom", 105 | "editable": true, 106 | "error": false, 107 | "format": "percentunit", 108 | "gauge": { 109 | "maxValue": 100, 110 | "minValue": 0, 111 | "show": false, 112 | "thresholdLabels": false, 113 | "thresholdMarkers": true 114 | }, 115 | "hideTimeOverride": true, 116 | "id": 5, 117 | "interval": null, 118 | "links": [], 119 | "mappingType": 1, 120 | "mappingTypes": [ 121 | { 122 | "name": "value to text", 123 | "value": 1 124 | }, 125 | { 126 | "name": "range to text", 127 | "value": 2 128 | } 129 | ], 130 | "maxDataPoints": 100, 131 | "nullPointMode": "connected", 132 | "nullText": null, 133 | "postfix": "", 134 | "postfixFontSize": "50%", 135 | "prefix": "", 136 | "prefixFontSize": "50%", 137 | "rangeMaps": [ 138 | { 139 | "from": "null", 140 | "text": "N/A", 141 | "to": "null" 142 | } 143 | ], 144 | "span": 2, 145 | "sparkline": { 146 | "fillColor": "rgba(31, 118, 189, 0.18)", 147 | "full": false, 148 | "lineColor": "rgb(31, 120, 193)", 149 | "show": true 150 | }, 151 | "targets": [ 152 | { 153 | "expr": "(1.0-(sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",cache=~\"(notcachable|miss)\"}[5m]))/sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",cache=\"hit\"}[5m]))))", 154 | "interval": "", 155 | "intervalFactor": 2, 156 | "refId": "A", 157 | "step": 4 158 | } 159 | ], 160 | "thresholds": "", 161 | "timeFrom": "5m", 162 | "title": "Origin hit offload", 163 | "type": "singlestat", 164 | "valueFontSize": "80%", 165 | "valueMaps": [ 166 | { 167 | "op": "=", 168 | "text": "N/A", 169 | "value": "null" 170 | } 171 | ], 172 | "valueName": "avg" 173 | }, 174 | { 175 | "cacheTimeout": null, 176 | "colorBackground": false, 177 | "colorValue": false, 178 | "colors": [ 179 | "rgba(245, 54, 54, 0.9)", 180 | "rgba(237, 129, 40, 0.89)", 181 | "rgba(50, 172, 45, 0.97)" 182 | ], 183 | "datasource": "prom", 184 | "editable": true, 185 | "error": false, 186 | "format": "none", 187 | "gauge": { 188 | "maxValue": 100, 189 | "minValue": 0, 190 | "show": false, 191 | "thresholdLabels": false, 192 | "thresholdMarkers": true 193 | }, 194 | "hideTimeOverride": true, 195 | "id": 1, 196 | "interval": null, 197 | "links": [], 198 | "mappingType": 1, 199 | "mappingTypes": [ 200 | { 201 | "name": "value to text", 202 | "value": 1 203 | }, 204 | { 205 | "name": "range to text", 206 | "value": 2 207 | } 208 | ], 209 | "maxDataPoints": 100, 210 | "nullPointMode": "connected", 211 | "nullText": null, 212 | "postfix": "", 213 | "postfixFontSize": "50%", 214 | "prefix": "", 215 | "prefixFontSize": "50%", 216 | "rangeMaps": [ 217 | { 218 | "from": "null", 219 | "text": "N/A", 220 | "to": "null" 221 | } 222 | ], 223 | "repeat": null, 224 | "span": 2, 225 | "sparkline": { 226 | "fillColor": "rgba(31, 118, 189, 0.18)", 227 | "full": false, 228 | "lineColor": "rgb(31, 120, 193)", 229 | "show": true 230 | }, 231 | "targets": [ 232 | { 233 | "expr": "sum(rate(cloudmonitor_http_requests_total{host=~\"$host\"}[5m]))", 234 | "interval": "", 235 | "intervalFactor": 2, 236 | "refId": "A", 237 | "step": 4 238 | } 239 | ], 240 | "thresholds": "", 241 | "timeFrom": "5m", 242 | "title": "Edge Req/s", 243 | "type": "singlestat", 244 | "valueFontSize": "110%", 245 | "valueMaps": [ 246 | { 247 | "op": "=", 248 | "text": "N/A", 249 | "value": "null" 250 | } 251 | ], 252 | "valueName": "avg" 253 | }, 254 | { 255 | "cacheTimeout": null, 256 | "colorBackground": false, 257 | "colorValue": false, 258 | "colors": [ 259 | "rgba(245, 54, 54, 0.9)", 260 | "rgba(237, 129, 40, 0.89)", 261 | "rgba(50, 172, 45, 0.97)" 262 | ], 263 | "datasource": "prom", 264 | "editable": true, 265 | "error": false, 266 | "format": "bps", 267 | "gauge": { 268 | "maxValue": 100, 269 | "minValue": 0, 270 | "show": false, 271 | "thresholdLabels": false, 272 | "thresholdMarkers": true 273 | }, 274 | "hideTimeOverride": true, 275 | "id": 2, 276 | "interval": null, 277 | "links": [], 278 | "mappingType": 1, 279 | "mappingTypes": [ 280 | { 281 | "name": "value to text", 282 | "value": 1 283 | }, 284 | { 285 | "name": "range to text", 286 | "value": 2 287 | } 288 | ], 289 | "maxDataPoints": 100, 290 | "nullPointMode": "connected", 291 | "nullText": null, 292 | "postfix": "", 293 | "postfixFontSize": "50%", 294 | "prefix": "", 295 | "prefixFontSize": "50%", 296 | "rangeMaps": [ 297 | { 298 | "from": "null", 299 | "text": "N/A", 300 | "to": "null" 301 | } 302 | ], 303 | "span": 3, 304 | "sparkline": { 305 | "fillColor": "rgba(31, 118, 189, 0.18)", 306 | "full": false, 307 | "lineColor": "rgb(31, 120, 193)", 308 | "show": true 309 | }, 310 | "targets": [ 311 | { 312 | "expr": "sum(irate(cloudmonitor_http_response_bytes_total{host=~\"$host\"}[5m])*8)", 313 | "interval": "1s", 314 | "intervalFactor": 2, 315 | "refId": "A", 316 | "step": 2 317 | } 318 | ], 319 | "thresholds": "", 320 | "timeFrom": "5m", 321 | "title": "Edge bandwidth", 322 | "type": "singlestat", 323 | "valueFontSize": "80%", 324 | "valueMaps": [ 325 | { 326 | "op": "=", 327 | "text": "N/A", 328 | "value": "null" 329 | } 330 | ], 331 | "valueName": "avg" 332 | }, 333 | { 334 | "cacheTimeout": null, 335 | "colorBackground": false, 336 | "colorValue": false, 337 | "colors": [ 338 | "rgba(245, 54, 54, 0.9)", 339 | "rgba(237, 129, 40, 0.89)", 340 | "rgba(50, 172, 45, 0.97)" 341 | ], 342 | "datasource": "prom", 343 | "decimals": 1, 344 | "editable": true, 345 | "error": false, 346 | "format": "bps", 347 | "gauge": { 348 | "maxValue": 100, 349 | "minValue": 0, 350 | "show": false, 351 | "thresholdLabels": false, 352 | "thresholdMarkers": true 353 | }, 354 | "hideTimeOverride": true, 355 | "id": 3, 356 | "interval": null, 357 | "links": [], 358 | "mappingType": 1, 359 | "mappingTypes": [ 360 | { 361 | "name": "value to text", 362 | "value": 1 363 | }, 364 | { 365 | "name": "range to text", 366 | "value": 2 367 | } 368 | ], 369 | "maxDataPoints": 100, 370 | "nullPointMode": "connected", 371 | "nullText": null, 372 | "postfix": "", 373 | "postfixFontSize": "50%", 374 | "prefix": "", 375 | "prefixFontSize": "50%", 376 | "rangeMaps": [ 377 | { 378 | "from": "null", 379 | "text": "N/A", 380 | "to": "null" 381 | } 382 | ], 383 | "span": 3, 384 | "sparkline": { 385 | "fillColor": "rgba(31, 118, 189, 0.18)", 386 | "full": false, 387 | "lineColor": "rgb(31, 120, 193)", 388 | "show": true 389 | }, 390 | "targets": [ 391 | { 392 | "expr": "sum(irate(cloudmonitor_http_response_bytes_total{host=~\"$host\", cache=~\"(miss|notcachable)\"}[5m])*8)", 393 | "intervalFactor": 2, 394 | "refId": "A", 395 | "step": 4 396 | } 397 | ], 398 | "thresholds": "", 399 | "timeFrom": "5m", 400 | "title": "Origin bandwidth", 401 | "type": "singlestat", 402 | "valueFontSize": "80%", 403 | "valueMaps": [ 404 | { 405 | "op": "=", 406 | "text": "N/A", 407 | "value": "null" 408 | } 409 | ], 410 | "valueName": "avg" 411 | } 412 | ], 413 | "repeat": null, 414 | "repeatIteration": null, 415 | "repeatRowId": null, 416 | "showTitle": false, 417 | "title": "Row", 418 | "titleSize": "h6" 419 | }, 420 | { 421 | "collapse": false, 422 | "height": "200px", 423 | "panels": [ 424 | { 425 | "aliasColors": {}, 426 | "bars": false, 427 | "datasource": "prom", 428 | "editable": true, 429 | "error": false, 430 | "fill": 1, 431 | "grid": {}, 432 | "id": 6, 433 | "legend": { 434 | "avg": false, 435 | "current": false, 436 | "max": false, 437 | "min": false, 438 | "show": true, 439 | "total": false, 440 | "values": false 441 | }, 442 | "lines": true, 443 | "linewidth": 2, 444 | "links": [], 445 | "nullPointMode": "connected", 446 | "percentage": false, 447 | "pointradius": 5, 448 | "points": false, 449 | "renderer": "flot", 450 | "seriesOverrides": [], 451 | "span": 4, 452 | "stack": false, 453 | "steppedLine": false, 454 | "targets": [ 455 | { 456 | "expr": "sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",status_code=~\"2..\"}[60m])*60)", 457 | "interval": "1m", 458 | "intervalFactor": 2, 459 | "legendFormat": "2xx", 460 | "refId": "A", 461 | "step": 120 462 | }, 463 | { 464 | "expr": "sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",status_code=~\"3..\"}[60m])*60)", 465 | "interval": "1m", 466 | "intervalFactor": 2, 467 | "legendFormat": "3xx", 468 | "refId": "B", 469 | "step": 120 470 | }, 471 | { 472 | "expr": "sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",status_code=~\"4..\"}[60m])*60)", 473 | "interval": "1m", 474 | "intervalFactor": 2, 475 | "legendFormat": "4xx", 476 | "refId": "C", 477 | "step": 120 478 | }, 479 | { 480 | "expr": "sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",status_code=~\"5..\"}[60m])*60)", 481 | "interval": "1m", 482 | "intervalFactor": 2, 483 | "legendFormat": "5xx", 484 | "refId": "D", 485 | "step": 120 486 | }, 487 | { 488 | "expr": "sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",status_code=~\"(0|000)\"}[60m])*60)", 489 | "interval": "1m", 490 | "intervalFactor": 2, 491 | "legendFormat": "0xx", 492 | "refId": "E", 493 | "step": 120 494 | } 495 | ], 496 | "thresholds": [], 497 | "timeFrom": null, 498 | "timeShift": null, 499 | "title": "Response codes/min", 500 | "tooltip": { 501 | "msResolution": true, 502 | "shared": true, 503 | "sort": 0, 504 | "value_type": "cumulative" 505 | }, 506 | "type": "graph", 507 | "xaxis": { 508 | "mode": "time", 509 | "name": null, 510 | "show": true, 511 | "values": [] 512 | }, 513 | "yaxes": [ 514 | { 515 | "format": "short", 516 | "label": null, 517 | "logBase": 1, 518 | "max": null, 519 | "min": null, 520 | "show": true 521 | }, 522 | { 523 | "format": "short", 524 | "label": null, 525 | "logBase": 1, 526 | "max": null, 527 | "min": null, 528 | "show": true 529 | } 530 | ] 531 | }, 532 | { 533 | "aliasColors": { 534 | "5xx": "#890F02" 535 | }, 536 | "bars": false, 537 | "datasource": "prom", 538 | "editable": true, 539 | "error": false, 540 | "fill": 1, 541 | "grid": {}, 542 | "id": 7, 543 | "legend": { 544 | "avg": false, 545 | "current": false, 546 | "max": false, 547 | "min": false, 548 | "show": true, 549 | "total": false, 550 | "values": false 551 | }, 552 | "lines": true, 553 | "linewidth": 2, 554 | "links": [], 555 | "nullPointMode": "connected", 556 | "percentage": false, 557 | "pointradius": 5, 558 | "points": false, 559 | "renderer": "flot", 560 | "seriesOverrides": [], 561 | "span": 4, 562 | "stack": false, 563 | "steppedLine": false, 564 | "targets": [ 565 | { 566 | "expr": "sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",status_code=~\"5..\"}[60m])*60)", 567 | "interval": "1m", 568 | "intervalFactor": 2, 569 | "legendFormat": "5xx", 570 | "refId": "D", 571 | "step": 120 572 | }, 573 | { 574 | "expr": "sum(irate(cloudmonitor_http_requests_total{host=~\"$host\",status_code=~\"(0|000)\"}[60m])*60)", 575 | "interval": "1m", 576 | "intervalFactor": 2, 577 | "legendFormat": "0xx", 578 | "refId": "E", 579 | "step": 120 580 | } 581 | ], 582 | "thresholds": [], 583 | "timeFrom": null, 584 | "timeShift": null, 585 | "title": "Error response codes/min", 586 | "tooltip": { 587 | "msResolution": true, 588 | "shared": true, 589 | "sort": 0, 590 | "value_type": "cumulative" 591 | }, 592 | "type": "graph", 593 | "xaxis": { 594 | "mode": "time", 595 | "name": null, 596 | "show": true, 597 | "values": [] 598 | }, 599 | "yaxes": [ 600 | { 601 | "format": "short", 602 | "label": null, 603 | "logBase": 1, 604 | "max": null, 605 | "min": null, 606 | "show": true 607 | }, 608 | { 609 | "format": "short", 610 | "label": null, 611 | "logBase": 1, 612 | "max": null, 613 | "min": null, 614 | "show": true 615 | } 616 | ] 617 | }, 618 | { 619 | "aliasColors": {}, 620 | "bars": false, 621 | "datasource": "prom", 622 | "editable": true, 623 | "error": false, 624 | "fill": 1, 625 | "grid": {}, 626 | "id": 8, 627 | "legend": { 628 | "avg": false, 629 | "current": false, 630 | "max": false, 631 | "min": false, 632 | "show": true, 633 | "total": false, 634 | "values": false 635 | }, 636 | "lines": true, 637 | "linewidth": 2, 638 | "links": [], 639 | "nullPointMode": "connected", 640 | "percentage": false, 641 | "pointradius": 5, 642 | "points": false, 643 | "renderer": "flot", 644 | "seriesOverrides": [], 645 | "span": 4, 646 | "stack": false, 647 | "steppedLine": false, 648 | "targets": [ 649 | { 650 | "expr": "sum by (cache) (irate(cloudmonitor_http_requests_total{host=~\"$host\"}[5m])*60)", 651 | "interval": "", 652 | "intervalFactor": 2, 653 | "legendFormat": "{{cache}}", 654 | "refId": "A", 655 | "step": 40 656 | } 657 | ], 658 | "thresholds": [], 659 | "timeFrom": null, 660 | "timeShift": null, 661 | "title": "Cache status/min", 662 | "tooltip": { 663 | "msResolution": true, 664 | "shared": true, 665 | "sort": 0, 666 | "value_type": "cumulative" 667 | }, 668 | "type": "graph", 669 | "xaxis": { 670 | "mode": "time", 671 | "name": null, 672 | "show": true, 673 | "values": [] 674 | }, 675 | "yaxes": [ 676 | { 677 | "format": "short", 678 | "label": null, 679 | "logBase": 1, 680 | "max": null, 681 | "min": null, 682 | "show": true 683 | }, 684 | { 685 | "format": "short", 686 | "label": null, 687 | "logBase": 1, 688 | "max": null, 689 | "min": null, 690 | "show": true 691 | } 692 | ] 693 | } 694 | ], 695 | "repeat": null, 696 | "repeatIteration": null, 697 | "repeatRowId": null, 698 | "showTitle": false, 699 | "title": "New row", 700 | "titleSize": "h6" 701 | }, 702 | { 703 | "collapse": false, 704 | "height": "250px", 705 | "panels": [ 706 | { 707 | "aliasColors": {}, 708 | "bars": false, 709 | "datasource": "prom", 710 | "editable": true, 711 | "error": false, 712 | "fill": 1, 713 | "grid": {}, 714 | "id": 15, 715 | "legend": { 716 | "alignAsTable": true, 717 | "avg": true, 718 | "current": true, 719 | "max": false, 720 | "min": false, 721 | "rightSide": true, 722 | "show": true, 723 | "sort": "total", 724 | "sortDesc": true, 725 | "total": false, 726 | "values": true 727 | }, 728 | "lines": true, 729 | "linewidth": 2, 730 | "links": [], 731 | "nullPointMode": "connected", 732 | "percentage": false, 733 | "pointradius": 5, 734 | "points": false, 735 | "renderer": "flot", 736 | "seriesOverrides": [], 737 | "span": 6, 738 | "stack": false, 739 | "steppedLine": false, 740 | "targets": [ 741 | { 742 | "expr": "sum(irate(cloudmonitor_http_device_requests_total{host=~\"$host\"}[5m])) by (device)", 743 | "intervalFactor": 2, 744 | "legendFormat": "{{device}}", 745 | "refId": "A", 746 | "step": 30 747 | } 748 | ], 749 | "thresholds": [], 750 | "timeFrom": null, 751 | "timeShift": null, 752 | "title": "Requests/device", 753 | "tooltip": { 754 | "msResolution": true, 755 | "shared": true, 756 | "sort": 0, 757 | "value_type": "cumulative" 758 | }, 759 | "type": "graph", 760 | "xaxis": { 761 | "mode": "time", 762 | "name": null, 763 | "show": true, 764 | "values": [] 765 | }, 766 | "yaxes": [ 767 | { 768 | "format": "short", 769 | "label": null, 770 | "logBase": 1, 771 | "max": null, 772 | "min": null, 773 | "show": true 774 | }, 775 | { 776 | "format": "short", 777 | "label": null, 778 | "logBase": 1, 779 | "max": null, 780 | "min": null, 781 | "show": true 782 | } 783 | ] 784 | }, 785 | { 786 | "aliasColors": {}, 787 | "bars": false, 788 | "datasource": "prom", 789 | "editable": true, 790 | "error": false, 791 | "fill": 1, 792 | "grid": {}, 793 | "id": 16, 794 | "legend": { 795 | "alignAsTable": true, 796 | "avg": true, 797 | "current": true, 798 | "hideEmpty": true, 799 | "hideZero": true, 800 | "max": false, 801 | "min": false, 802 | "rightSide": true, 803 | "show": true, 804 | "total": false, 805 | "values": true 806 | }, 807 | "lines": true, 808 | "linewidth": 2, 809 | "links": [], 810 | "nullPointMode": "connected", 811 | "percentage": false, 812 | "pointradius": 5, 813 | "points": false, 814 | "renderer": "flot", 815 | "seriesOverrides": [], 816 | "span": 6, 817 | "stack": false, 818 | "steppedLine": false, 819 | "targets": [ 820 | { 821 | "expr": "sum(irate(cloudmonitor_http_geo_requests_total{host=~\"$host\"}[5m])) by (country)", 822 | "intervalFactor": 2, 823 | "legendFormat": "{{country}}", 824 | "refId": "A", 825 | "step": 30 826 | } 827 | ], 828 | "thresholds": [], 829 | "timeFrom": null, 830 | "timeShift": null, 831 | "title": "Requets/country", 832 | "tooltip": { 833 | "msResolution": true, 834 | "shared": true, 835 | "sort": 0, 836 | "value_type": "cumulative" 837 | }, 838 | "type": "graph", 839 | "xaxis": { 840 | "mode": "time", 841 | "name": null, 842 | "show": true, 843 | "values": [] 844 | }, 845 | "yaxes": [ 846 | { 847 | "format": "short", 848 | "label": null, 849 | "logBase": 1, 850 | "max": null, 851 | "min": null, 852 | "show": true 853 | }, 854 | { 855 | "format": "short", 856 | "label": null, 857 | "logBase": 1, 858 | "max": null, 859 | "min": null, 860 | "show": true 861 | } 862 | ] 863 | } 864 | ], 865 | "repeat": null, 866 | "repeatIteration": null, 867 | "repeatRowId": null, 868 | "showTitle": false, 869 | "title": "New row", 870 | "titleSize": "h6" 871 | }, 872 | { 873 | "collapse": false, 874 | "height": "200px", 875 | "panels": [ 876 | { 877 | "aliasColors": {}, 878 | "bars": false, 879 | "datasource": "prom", 880 | "editable": true, 881 | "error": false, 882 | "fill": 1, 883 | "grid": {}, 884 | "id": 14, 885 | "legend": { 886 | "alignAsTable": false, 887 | "avg": false, 888 | "current": false, 889 | "max": false, 890 | "min": false, 891 | "show": true, 892 | "total": false, 893 | "values": false 894 | }, 895 | "lines": true, 896 | "linewidth": 2, 897 | "links": [], 898 | "nullPointMode": "connected", 899 | "percentage": false, 900 | "pointradius": 5, 901 | "points": false, 902 | "renderer": "flot", 903 | "seriesOverrides": [], 904 | "span": 4, 905 | "stack": false, 906 | "steppedLine": false, 907 | "targets": [ 908 | { 909 | "expr": "avg by (cache,quantile)(cloudmonitor_http_origin_latency_milliseconds{host=~\"$host\"})", 910 | "intervalFactor": 2, 911 | "legendFormat": "{{cache}}({{quantile}})", 912 | "refId": "A", 913 | "step": 40 914 | } 915 | ], 916 | "thresholds": [], 917 | "timeFrom": null, 918 | "timeShift": null, 919 | "title": "Avg origin latency", 920 | "tooltip": { 921 | "msResolution": true, 922 | "shared": true, 923 | "sort": 0, 924 | "value_type": "cumulative" 925 | }, 926 | "type": "graph", 927 | "xaxis": { 928 | "mode": "time", 929 | "name": null, 930 | "show": true, 931 | "values": [] 932 | }, 933 | "yaxes": [ 934 | { 935 | "format": "ms", 936 | "label": null, 937 | "logBase": 1, 938 | "max": null, 939 | "min": null, 940 | "show": true 941 | }, 942 | { 943 | "format": "short", 944 | "label": null, 945 | "logBase": 1, 946 | "max": null, 947 | "min": null, 948 | "show": true 949 | } 950 | ] 951 | }, 952 | { 953 | "aliasColors": {}, 954 | "bars": false, 955 | "datasource": "prom", 956 | "editable": true, 957 | "error": false, 958 | "fill": 1, 959 | "grid": {}, 960 | "id": 13, 961 | "legend": { 962 | "avg": false, 963 | "current": false, 964 | "max": false, 965 | "min": false, 966 | "show": true, 967 | "total": false, 968 | "values": false 969 | }, 970 | "lines": true, 971 | "linewidth": 2, 972 | "links": [], 973 | "nullPointMode": "connected", 974 | "percentage": false, 975 | "pointradius": 5, 976 | "points": false, 977 | "renderer": "flot", 978 | "seriesOverrides": [], 979 | "span": 4, 980 | "stack": false, 981 | "steppedLine": false, 982 | "targets": [ 983 | { 984 | "expr": "avg by (cache,quantile)(cloudmonitor_http_response_latency_milliseconds{host=~\"$host\"})", 985 | "interval": "", 986 | "intervalFactor": 2, 987 | "legendFormat": "{{cache}}({{quantile*100}})", 988 | "refId": "A", 989 | "step": 40 990 | } 991 | ], 992 | "thresholds": [], 993 | "timeFrom": null, 994 | "timeShift": null, 995 | "title": "Avg response>client latency", 996 | "tooltip": { 997 | "msResolution": true, 998 | "shared": true, 999 | "sort": 0, 1000 | "value_type": "cumulative" 1001 | }, 1002 | "type": "graph", 1003 | "xaxis": { 1004 | "mode": "time", 1005 | "name": null, 1006 | "show": true, 1007 | "values": [] 1008 | }, 1009 | "yaxes": [ 1010 | { 1011 | "format": "ms", 1012 | "label": null, 1013 | "logBase": 1, 1014 | "max": null, 1015 | "min": null, 1016 | "show": true 1017 | }, 1018 | { 1019 | "format": "short", 1020 | "label": null, 1021 | "logBase": 1, 1022 | "max": null, 1023 | "min": null, 1024 | "show": true 1025 | } 1026 | ] 1027 | }, 1028 | { 1029 | "aliasColors": {}, 1030 | "bars": false, 1031 | "datasource": "prom", 1032 | "editable": true, 1033 | "error": false, 1034 | "fill": 1, 1035 | "grid": {}, 1036 | "id": 10, 1037 | "legend": { 1038 | "avg": false, 1039 | "current": false, 1040 | "max": false, 1041 | "min": false, 1042 | "show": true, 1043 | "total": false, 1044 | "values": false 1045 | }, 1046 | "lines": true, 1047 | "linewidth": 2, 1048 | "links": [], 1049 | "nullPointMode": "connected", 1050 | "percentage": false, 1051 | "pointradius": 5, 1052 | "points": false, 1053 | "renderer": "flot", 1054 | "seriesOverrides": [], 1055 | "span": 4, 1056 | "stack": false, 1057 | "steppedLine": false, 1058 | "targets": [ 1059 | { 1060 | "expr": "sum(rate(cloudmonitor_http_response_content_types_total{host=~\"$host\"}[5m])) by (content_type)", 1061 | "intervalFactor": 2, 1062 | "legendFormat": "{{content_type}}", 1063 | "refId": "A", 1064 | "step": 40 1065 | } 1066 | ], 1067 | "thresholds": [], 1068 | "timeFrom": null, 1069 | "timeShift": null, 1070 | "title": "Content types", 1071 | "tooltip": { 1072 | "msResolution": true, 1073 | "shared": true, 1074 | "sort": 0, 1075 | "value_type": "cumulative" 1076 | }, 1077 | "type": "graph", 1078 | "xaxis": { 1079 | "mode": "time", 1080 | "name": null, 1081 | "show": true, 1082 | "values": [] 1083 | }, 1084 | "yaxes": [ 1085 | { 1086 | "format": "short", 1087 | "label": null, 1088 | "logBase": 1, 1089 | "max": null, 1090 | "min": null, 1091 | "show": true 1092 | }, 1093 | { 1094 | "format": "short", 1095 | "label": null, 1096 | "logBase": 1, 1097 | "max": null, 1098 | "min": null, 1099 | "show": true 1100 | } 1101 | ] 1102 | } 1103 | ], 1104 | "repeat": null, 1105 | "repeatIteration": null, 1106 | "repeatRowId": null, 1107 | "showTitle": false, 1108 | "title": "New row", 1109 | "titleSize": "h6" 1110 | }, 1111 | { 1112 | "collapse": false, 1113 | "height": "250px", 1114 | "panels": [ 1115 | { 1116 | "cacheTimeout": null, 1117 | "colorBackground": false, 1118 | "colorValue": false, 1119 | "colors": [ 1120 | "rgba(245, 54, 54, 0.9)", 1121 | "rgba(237, 129, 40, 0.89)", 1122 | "rgba(50, 172, 45, 0.97)" 1123 | ], 1124 | "datasource": "prom", 1125 | "decimals": 1, 1126 | "editable": true, 1127 | "error": false, 1128 | "format": "bps", 1129 | "gauge": { 1130 | "maxValue": 100, 1131 | "minValue": 0, 1132 | "show": false, 1133 | "thresholdLabels": false, 1134 | "thresholdMarkers": true 1135 | }, 1136 | "hideTimeOverride": true, 1137 | "id": 11, 1138 | "interval": null, 1139 | "links": [], 1140 | "mappingType": 1, 1141 | "mappingTypes": [ 1142 | { 1143 | "name": "value to text", 1144 | "value": 1 1145 | }, 1146 | { 1147 | "name": "range to text", 1148 | "value": 2 1149 | } 1150 | ], 1151 | "maxDataPoints": 100, 1152 | "nullPointMode": "connected", 1153 | "nullText": null, 1154 | "postfix": "", 1155 | "postfixFontSize": "50%", 1156 | "prefix": "", 1157 | "prefixFontSize": "50%", 1158 | "rangeMaps": [ 1159 | { 1160 | "from": "null", 1161 | "text": "N/A", 1162 | "to": "null" 1163 | } 1164 | ], 1165 | "span": 2, 1166 | "sparkline": { 1167 | "fillColor": "rgba(31, 118, 189, 0.18)", 1168 | "full": false, 1169 | "lineColor": "rgb(31, 120, 193)", 1170 | "show": true 1171 | }, 1172 | "targets": [ 1173 | { 1174 | "expr": "sum(irate(cloudmonitor_post_size_bytes_total[5m])*8)", 1175 | "interval": "1s", 1176 | "intervalFactor": 2, 1177 | "refId": "A", 1178 | "step": 2 1179 | } 1180 | ], 1181 | "thresholds": "", 1182 | "timeFrom": "5m", 1183 | "title": "Exporter processing bandwidth", 1184 | "type": "singlestat", 1185 | "valueFontSize": "80%", 1186 | "valueMaps": [ 1187 | { 1188 | "op": "=", 1189 | "text": "N/A", 1190 | "value": "null" 1191 | } 1192 | ], 1193 | "valueName": "avg" 1194 | }, 1195 | { 1196 | "aliasColors": {}, 1197 | "bars": false, 1198 | "datasource": "prom", 1199 | "editable": true, 1200 | "error": false, 1201 | "fill": 1, 1202 | "grid": {}, 1203 | "id": 9, 1204 | "legend": { 1205 | "avg": false, 1206 | "current": false, 1207 | "max": false, 1208 | "min": false, 1209 | "show": true, 1210 | "total": false, 1211 | "values": false 1212 | }, 1213 | "lines": true, 1214 | "linewidth": 2, 1215 | "links": [], 1216 | "nullPointMode": "connected", 1217 | "percentage": false, 1218 | "pointradius": 5, 1219 | "points": false, 1220 | "renderer": "flot", 1221 | "seriesOverrides": [], 1222 | "span": 8, 1223 | "stack": false, 1224 | "steppedLine": false, 1225 | "targets": [ 1226 | { 1227 | "expr": "avg by (quantile)(cloudmonitor_log_latency_seconds)", 1228 | "interval": "1s", 1229 | "intervalFactor": 2, 1230 | "legendFormat": "{{quantile}} Percentile", 1231 | "refId": "A", 1232 | "step": 2 1233 | } 1234 | ], 1235 | "thresholds": [], 1236 | "timeFrom": null, 1237 | "timeShift": null, 1238 | "title": "Log latency", 1239 | "tooltip": { 1240 | "msResolution": true, 1241 | "shared": true, 1242 | "sort": 0, 1243 | "value_type": "cumulative" 1244 | }, 1245 | "type": "graph", 1246 | "xaxis": { 1247 | "mode": "time", 1248 | "name": null, 1249 | "show": true, 1250 | "values": [] 1251 | }, 1252 | "yaxes": [ 1253 | { 1254 | "format": "s", 1255 | "label": null, 1256 | "logBase": 1, 1257 | "max": null, 1258 | "min": null, 1259 | "show": true 1260 | }, 1261 | { 1262 | "format": "short", 1263 | "label": null, 1264 | "logBase": 1, 1265 | "max": null, 1266 | "min": null, 1267 | "show": true 1268 | } 1269 | ] 1270 | }, 1271 | { 1272 | "cacheTimeout": null, 1273 | "colorBackground": false, 1274 | "colorValue": false, 1275 | "colors": [ 1276 | "rgba(245, 54, 54, 0.9)", 1277 | "rgba(237, 129, 40, 0.89)", 1278 | "rgba(50, 172, 45, 0.97)" 1279 | ], 1280 | "datasource": "prom", 1281 | "editable": true, 1282 | "error": false, 1283 | "format": "none", 1284 | "gauge": { 1285 | "maxValue": 100, 1286 | "minValue": 0, 1287 | "show": false, 1288 | "thresholdLabels": false, 1289 | "thresholdMarkers": true 1290 | }, 1291 | "id": 12, 1292 | "interval": null, 1293 | "links": [], 1294 | "mappingType": 1, 1295 | "mappingTypes": [ 1296 | { 1297 | "name": "value to text", 1298 | "value": 1 1299 | }, 1300 | { 1301 | "name": "range to text", 1302 | "value": 2 1303 | } 1304 | ], 1305 | "maxDataPoints": 100, 1306 | "nullPointMode": "connected", 1307 | "nullText": null, 1308 | "postfix": "", 1309 | "postfixFontSize": "50%", 1310 | "prefix": "", 1311 | "prefixFontSize": "50%", 1312 | "rangeMaps": [ 1313 | { 1314 | "from": "null", 1315 | "text": "N/A", 1316 | "to": "null" 1317 | } 1318 | ], 1319 | "span": 2, 1320 | "sparkline": { 1321 | "fillColor": "rgba(31, 118, 189, 0.18)", 1322 | "full": false, 1323 | "lineColor": "rgb(31, 120, 193)", 1324 | "show": true 1325 | }, 1326 | "targets": [ 1327 | { 1328 | "expr": "sum(rate(cloudmonitor_parse_errors_total[5m]))", 1329 | "intervalFactor": 2, 1330 | "refId": "A", 1331 | "step": 600 1332 | } 1333 | ], 1334 | "thresholds": "", 1335 | "title": "Exporter errors", 1336 | "type": "singlestat", 1337 | "valueFontSize": "80%", 1338 | "valueMaps": [ 1339 | { 1340 | "op": "=", 1341 | "text": "N/A", 1342 | "value": "null" 1343 | } 1344 | ], 1345 | "valueName": "avg" 1346 | } 1347 | ], 1348 | "repeat": null, 1349 | "repeatIteration": null, 1350 | "repeatRowId": null, 1351 | "showTitle": false, 1352 | "title": "New row", 1353 | "titleSize": "h6" 1354 | } 1355 | ], 1356 | "schemaVersion": 14, 1357 | "style": "dark", 1358 | "tags": [], 1359 | "templating": { 1360 | "list": [ 1361 | { 1362 | "allValue": ".*", 1363 | "current": { 1364 | "text": "All", 1365 | "value": "$__all" 1366 | }, 1367 | "datasource": "prom", 1368 | "hide": 0, 1369 | "includeAll": true, 1370 | "label": "Hostname", 1371 | "multi": false, 1372 | "name": "host", 1373 | "options": [], 1374 | "query": "cloudmonitor_http_requests_total{}", 1375 | "refresh": 1, 1376 | "regex": ".*host=\"([a-z0-9-\\.]*)\".*", 1377 | "sort": 0, 1378 | "tagValuesQuery": "", 1379 | "tags": [], 1380 | "tagsQuery": "", 1381 | "type": "query", 1382 | "useTags": false 1383 | } 1384 | ] 1385 | }, 1386 | "time": { 1387 | "from": "now-6h", 1388 | "to": "now" 1389 | }, 1390 | "timepicker": { 1391 | "refresh_intervals": [ 1392 | "5s", 1393 | "10s", 1394 | "30s", 1395 | "1m", 1396 | "5m", 1397 | "15m", 1398 | "30m", 1399 | "1h", 1400 | "2h", 1401 | "1d" 1402 | ], 1403 | "time_options": [ 1404 | "5m", 1405 | "15m", 1406 | "1h", 1407 | "6h", 1408 | "12h", 1409 | "24h", 1410 | "2d", 1411 | "7d", 1412 | "30d" 1413 | ] 1414 | }, 1415 | "timezone": "browser", 1416 | "title": "Akamai", 1417 | "version": 3 1418 | } -------------------------------------------------------------------------------- /setup/grafana_data/grafana.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ExpressenAB/cloudmonitor_exporter/3bd8698de697dcd58ea2f712485d083eaf879e5a/setup/grafana_data/grafana.db -------------------------------------------------------------------------------- /setup/prometheus.yml: -------------------------------------------------------------------------------- 1 | # my global config 2 | global: 3 | scrape_interval: 15s # By default, scrape targets every 15 seconds. 4 | evaluation_interval: 15s # By default, scrape targets every 15 seconds. 5 | # scrape_timeout is set to the global default (10s). 6 | 7 | # Attach these labels to any time series or alerts when communicating with 8 | # external systems (federation, remote storage, Alertmanager). 9 | external_labels: 10 | monitor: 'my-project' 11 | 12 | # Load and evaluate rules in this file every 'evaluation_interval' seconds. 13 | rule_files: 14 | - "alert.rules" 15 | # - "first.rules" 16 | # - "second.rules" 17 | 18 | # A scrape configuration containing exactly one endpoint to scrape: 19 | # Here it's Prometheus itself. 20 | scrape_configs: 21 | # The job name is added as a label `job=` to any timeseries scraped from this config. 22 | - job_name: 'prometheus' 23 | 24 | # Override the global default and scrape targets from this job every 5 seconds. 25 | scrape_interval: 5s 26 | 27 | # metrics_path defaults to '/metrics' 28 | # scheme defaults to 'http'. 29 | 30 | static_configs: 31 | - targets: ['localhost:9090','cloudmonitor:9143'] 32 | -------------------------------------------------------------------------------- /setup/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ ! -f cert.pem ]; then 4 | echo "This will generate a self-signed certificate to use with cloudmonitor_exporter\nEnter companyname for certificate: " 5 | read company 6 | openssl req -x509 -newkey rsa:2048 -keyout key.pem -out ca.pem -days 1080 -nodes -subj "/CN=*/O=$company./C=US" && cp key.pem cert.pem && cat ca.pem >> cert.pem 7 | fi 8 | 9 | -------------------------------------------------------------------------------- /tests/localtest.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | for i in {1..10000}; do curl -XPOST --data-binary @payload.json localhost:9143/collector -H Content-Type:application/json;echo $i; done 3 | 4 | -------------------------------------------------------------------------------- /tests/payload.json: -------------------------------------------------------------------------------- 1 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"DK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"120","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 2 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"12340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 3 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"SE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"123450","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"compress"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 4 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"UK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"1234560","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"identity"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 5 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"FI","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"12340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 6 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"ES","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"23452450","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"501"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 7 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"IT","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"12340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"502"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"compress"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 8 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"DE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"123440","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"503"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"identity"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 9 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"DK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"42340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"504"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 10 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"10","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"404"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 11 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"SE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"120","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"301"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 12 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"UK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"301"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"deflate"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 13 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"FI","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"302"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 14 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"ES","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"123450","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 15 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"IT","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1234560","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"deflate"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 16 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"ES","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"123450","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 17 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"DK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"123430","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 18 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"SE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"123410","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 19 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"501"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 20 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"500"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 21 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"404"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"deflate"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 22 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"RU","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"404"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 23 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"AS","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"40"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 24 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"VD","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 25 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"RE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 26 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"AS","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 27 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"OP","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"120","cliIP":"123.123.123.123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"deflate"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 28 | 29 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"DK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"120","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 30 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"12340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 31 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"SE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"123450","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"compress"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 32 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"UK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"1234560","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"identity"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 33 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"FI","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"12340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 34 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"ES","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"23452450","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"501"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 35 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"IT","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"12340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"502"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"compress"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 36 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"DE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"123440","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"503"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"identity"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 37 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"DK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla%2f5.0%20(Macintosh%3b%20Intel%20Mac%20OS%20X%2010.9%3b%20rv%3a28.0)%20Gecko%2f20100101%20Firefox%2f28.0%20(FlipboardProxy%2f1.1%3b%20+http%3a%2f%2fflipboard.com%2fbrowserproxy)","bytes":"42340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"504"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 38 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"10","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"404"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 39 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"SE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"120","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"301"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 40 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"UK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"301"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"deflate"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 41 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"FI","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"302"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 42 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"ES","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"123450","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 43 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"IT","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1234560","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"deflate"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 44 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"ES","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"123450","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 45 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"DK","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"123430","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 46 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"SE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"123410","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 47 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"501"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 48 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"500"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 49 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"US","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"404"},"netPerf":{"asnum":"8523","cacheStatus":"2","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"deflate"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 50 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"RU","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"404"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 51 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"AS","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"40"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 52 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"VD","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"1","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 53 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"RE","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"1230","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"GET","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"gzip"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 54 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"AS","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"12340","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"POST","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"br"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} 55 | {"cp":"123456","format":"default","geo":{"city":"dummy","country":"OP","lat":"59.33","long":"18.05","region":"AB"},"id":"915cfea5570f824cc27112-a","message":{"UA":"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3","bytes":"120","cliIP":"2001::123","fwdHost":"www.example.com","proto":"http","protoVer":"1.1","reqHost":"www.example.com","reqMethod":"PUT","reqPath":"%2f","reqPort":"80","respCT":"text/html","respLen":"276248","status":"200"},"netPerf":{"asnum":"8523","cacheStatus":"0","downloadTime":"1","edgeIP":"165.254.92.141","firstByte":"0","lastByte":"0","lastMileRTT":"102"},"network":{"asnum":"8523","edgeIP":"165.254.92.141","network":"","networkType":""},"reqHdr":{"cookie":"drbanan%3d1"},"respHdr":{"server":"Microsoft-IIS/8.5","contEnc":"deflate"},"start":"1460634188.565","type":"cloud_monitor","version":"1.0"} --------------------------------------------------------------------------------