├── .gitignore ├── images ├── pop-up.png ├── pop-up-dashboard.png └── pop-up.excalidraw ├── provisioning ├── plugins │ └── redis-app.yaml ├── dashboards │ ├── package.yaml │ └── pop-up.json └── datasources │ └── redis.yaml ├── docker-cmd.sh ├── Dockerfile ├── gears ├── timeseries.py └── orders.py ├── CHANGELOG.md ├── package.json ├── docker-compose.yml ├── .github └── workflows │ └── docker.yml ├── src └── pop-up-store.js ├── README.md ├── yarn.lock └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /images/pop-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RedisGrafana/redis-pop-up-store/HEAD/images/pop-up.png -------------------------------------------------------------------------------- /provisioning/plugins/redis-app.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | apps: 4 | - type: redis-app 5 | disabled: false 6 | -------------------------------------------------------------------------------- /images/pop-up-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RedisGrafana/redis-pop-up-store/HEAD/images/pop-up-dashboard.png -------------------------------------------------------------------------------- /provisioning/dashboards/package.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: Default # A uniquely identifiable name for the provider 5 | type: file 6 | options: 7 | path: /etc/grafana/provisioning/dashboards 8 | -------------------------------------------------------------------------------- /provisioning/datasources/redis.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | datasources: 4 | - name: Redis 5 | type: redis-datasource 6 | access: proxy 7 | orgId: 1 8 | isDefault: true 9 | version: 1 10 | url: redis://host.docker.internal:6379 11 | editable: true 12 | -------------------------------------------------------------------------------- /docker-cmd.sh: -------------------------------------------------------------------------------- 1 | # Install StreamReader for Time-Series 2 | cat gears/timeseries.py | redis-cli -h redis -x RG.PYEXECUTE 3 | 4 | # Install StreamReader for Orders 5 | cat gears/orders.py | redis-cli -h redis -x RG.PYEXECUTE 6 | 7 | # Run Simulation 8 | echo "Starting Customers & Orders simulation" 9 | npm run simulation redis -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node 2 | WORKDIR /app 3 | 4 | # Install depenencies 5 | COPY package.json . 6 | COPY yarn.lock . 7 | RUN yarn install 8 | 9 | # Install Redis tools 10 | RUN apt update 11 | RUN apt install -y redis-tools 12 | 13 | # Copy Gears and application 14 | COPY gears ./gears 15 | COPY src ./src 16 | COPY ./docker-cmd.sh . 17 | 18 | # Run 19 | CMD [ "./docker-cmd.sh" ] -------------------------------------------------------------------------------- /gears/timeseries.py: -------------------------------------------------------------------------------- 1 | # Add Time-Series 2 | def tsAdd(x): 3 | xlen = execute('XLEN', x['key']) 4 | execute('TS.ADD', 'ts:len:'+x['key'], '*', xlen) 5 | execute('TS.ADD', 'ts:enqueue:' + x['key'], '*', x['value']) 6 | 7 | 8 | # Stream Reader for any Queue 9 | gb = GearsBuilder('StreamReader') 10 | gb.countby(lambda x: x['key']).map(tsAdd) 11 | gb.register(prefix='queue:*', duration=5000, batch=10000, trimStream=False) 12 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 2.1.0 (2021-12-25) 4 | 5 | ### Features / Enhancements 6 | 7 | - Add Docker container for the Demo Application (#11) 8 | - Add Docker workflow (#12) 9 | - Update dashboards (#13) 10 | 11 | ## 2.0.0 (2021-10-11) 12 | 13 | ### Features / Enhancements 14 | 15 | - Added Streaming dashboard 16 | - Update screenshots and dashboards for Grafana 8.2 17 | - Added demo on https://demo.volkovlabs.io 18 | 19 | ## v1.0.0 (2020-07-12) 20 | 21 | ### Features / Enhancements 22 | 23 | - Initial release 24 | -------------------------------------------------------------------------------- /gears/orders.py: -------------------------------------------------------------------------------- 1 | # Complete order 2 | def complete(x): 3 | execute('XADD', 'queue:complete', '*', 'order', x['id'], 4 | 'customer', x['value']['customer']) 5 | execute('XDEL', 'queue:customers', x['value']['customer']) 6 | execute('DECR', 'product') 7 | 8 | product = execute('GET', 'product') 9 | if int(product) < 1000: 10 | execute('SET', 'product', 10000) 11 | 12 | 13 | # Stream Reader for Orders queue 14 | gb = GearsBuilder('StreamReader') 15 | gb.map(complete) 16 | gb.register(prefix='orders', batch=3, trimStream=True) 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Mikhail Volkov", 3 | "dependencies": { 4 | "ioredis": "^4.28.2", 5 | "lodash": "^4.17.21" 6 | }, 7 | "description": "Pop-up store using RedisTimeSeries, RedisGears and Redis plugins for Grafana", 8 | "license": "Apache-2.0", 9 | "name": "redis-pop-up-store", 10 | "scripts": { 11 | "docker:build": "docker-compose build", 12 | "redis-cli": "docker exec -it redis redis-cli", 13 | "simulation": "npm i; node src/pop-up-store.js", 14 | "start": "docker-compose pull && docker-compose up", 15 | "stop": "docker-compose down", 16 | "upgrade": "yarn upgrade --latest" 17 | }, 18 | "version": "2.1.0" 19 | } 20 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.4" 2 | 3 | services: 4 | app: 5 | build: . 6 | image: ghcr.io/redisgrafana/pop-up-store:latest 7 | depends_on: 8 | - redis 9 | 10 | redis: 11 | container_name: redis 12 | image: redislabs/redismod 13 | ports: 14 | - "6379:6379" 15 | 16 | grafana: 17 | container_name: grafana 18 | image: ghcr.io/redisgrafana/redis-app:latest 19 | ports: 20 | - "3000:3000" 21 | environment: 22 | - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin 23 | - GF_AUTH_ANONYMOUS_ENABLED=true 24 | - GF_AUTH_BASIC_ENABLED=false 25 | - GF_ENABLE_GZIP=true 26 | - GF_USERS_DEFAULT_THEME=light 27 | volumes: 28 | - ./provisioning:/etc/grafana/provisioning 29 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Docker 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | docker: 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v2 12 | 13 | - name: Set up QEMU 14 | uses: docker/setup-qemu-action@v1 15 | 16 | - name: Set up Docker Buildx 17 | uses: docker/setup-buildx-action@v1 18 | 19 | - name: Login to GitHub Container Registry 20 | uses: docker/login-action@v1 21 | with: 22 | registry: ghcr.io 23 | username: ${{ github.repository_owner }} 24 | password: ${{ secrets.GITHUB_TOKEN }} 25 | 26 | - name: Push images 27 | id: docker_push 28 | uses: docker/build-push-action@v2 29 | with: 30 | platforms: linux/amd64,linux/arm64 31 | push: true 32 | tags: ghcr.io/redisgrafana/pop-up-store:latest 33 | 34 | - name: Image digest 35 | run: echo ${{ steps.docker_build.outputs.digest }} 36 | -------------------------------------------------------------------------------- /src/pop-up-store.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A robust, performance-focused and full-featured Redis client for Node.js. 3 | * 4 | * @see https://github.com/luin/ioredis 5 | */ 6 | const Redis = require("ioredis"); 7 | 8 | /** 9 | * You can also specify connection options as a redis:// URL or rediss:// URL when using TLS encryption: 10 | */ 11 | const redis = new Redis(getRedisURI()); 12 | 13 | /** 14 | * There are 10000 products on sale today 15 | * 16 | * @see https://redis.io/commands/set 17 | */ 18 | const product = 10000; 19 | redis.set("product", product); 20 | 21 | /** 22 | * Get Redis host from first argument (optional) 23 | * argv is: [ '/usr/local/bin/node', '/app/src/pop-up-store.js', '...' ] 24 | */ 25 | function getRedisURI() { 26 | if (process.argv.length > 2) { 27 | return "redis://"+process.argv[2]+":6379"; 28 | } else { 29 | return "redis://localhost:6379"; 30 | } 31 | } 32 | 33 | /** 34 | * Generate Id 35 | */ 36 | function genId() { 37 | return Math.random().toString(36).substr(2, 9); 38 | } 39 | 40 | /** 41 | * Every customer wants to buy 1 product 42 | */ 43 | function submitOrder(err, result) { 44 | if (err) { 45 | console.error(err); 46 | return; 47 | } 48 | 49 | /** 50 | * Waiting for customer to submit order 51 | * 52 | * @see https://redis.io/commands/xadd 53 | */ 54 | setTimeout(function () { 55 | redis.xadd("orders", "*", "id", genId(), "customer", result); 56 | }, Math.floor(Math.random() * 1000)); 57 | } 58 | 59 | /** 60 | * New customer 61 | */ 62 | function newCustomer() { 63 | /** 64 | * Registering new customer 65 | */ 66 | redis.xadd("queue:customers", "*", "id", genId(), submitOrder); 67 | 68 | /** 69 | * Waiting for the next 70 | */ 71 | setTimeout(newCustomer, Math.floor(Math.random() * 1000)); 72 | } 73 | 74 | /** 75 | * Sale started 76 | */ 77 | console.log("Now running simulation...") 78 | newCustomer(); 79 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pop-up store demo using RedisTimeSeries, RedisGears and Redis plugins for Grafana 2 | 3 | ![Pop-up](https://github.com/RedisGrafana/redis-pop-up-store/blob/master/images/pop-up-dashboard.png) 4 | 5 | [![Grafana 8](https://img.shields.io/badge/Grafana-8-orange)](https://www.grafana.com) 6 | [![Redis Data Source](https://img.shields.io/badge/dynamic/json?color=blue&label=Redis%20Data%20Source&query=%24.version&url=https%3A%2F%2Fgrafana.com%2Fapi%2Fplugins%2Fredis-datasource)](https://grafana.com/grafana/plugins/redis-datasource) [![Redis Application](https://img.shields.io/badge/dynamic/json?color=blue&label=Redis%20Application&query=%24.version&url=https%3A%2F%2Fgrafana.com%2Fapi%2Fplugins%2Fredis-app)](https://grafana.com/grafana/plugins/redis-app) 7 | 8 | ## Introduction 9 | 10 | The Pop-up store is using [Redis Streams](https://redis.io/topics/streams-intro), [RedisTimeSeries](https://oss.redis.com/redistimeseries/), [RedisGears](https://oss.redis.com/redisgears/) and [Redis plugins](https://redisgrafana.github.io) to visualize data pipeline in Grafana. 11 | 12 | ![Diagram](https://github.com/RedisGrafana/redis-pop-up-store/blob/master/images/pop-up.png) 13 | 14 | - Node.js script adds random data to Customers and Orders streams 15 | - RedisGears is using `StreamReader` to watch all `queue:` keys and adding Time-Series samples 16 | - Another RedisGears script completes orders 17 | - adding data to `queue:complete` stream 18 | - deleting client's ordering 19 | - decreasing product amount 20 | - trimming Orders queue 21 | - Grafana query streams and Time-Series keys every 5 seconds to display samples using Grafana plugins. 22 | 23 | ## Demo 24 | 25 | Demo is available on [demo.volkovlabs.io](https://demo.volkovlabs.io): 26 | 27 | - [Redis Overview dashboard](https://demo.volkovlabs.io/d/TgibHBv7z/redis-overview?orgId=1&refresh=1h) 28 | - [Pop-up Store dashboard](https://demo.volkovlabs.io/d/0LC0Sm7Ml/pop-up-store?orgId=1) 29 | 30 | ## Requirements 31 | 32 | - [Docker](https://docker.com) to start Redis and Grafana. 33 | - [Node.js](https://nodejs.org) to run simulation script. 34 | 35 | ## Start Redis, Grafana and Application simulation 36 | 37 | ``` 38 | npm run start 39 | ``` 40 | 41 | ## Grafana Dashboards 42 | 43 | Open Grafana Dashboard using browser http://localhost:3000 44 | 45 | ## Redis-cli 46 | 47 | To start `redis-cli` and look at the keys please run 48 | 49 | ``` 50 | npm run redis-cli 51 | ``` 52 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | cluster-key-slot@^1.1.0: 6 | version "1.1.0" 7 | resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" 8 | integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== 9 | 10 | debug@^4.3.1: 11 | version "4.3.3" 12 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 13 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 14 | dependencies: 15 | ms "2.1.2" 16 | 17 | denque@^1.1.0: 18 | version "1.5.1" 19 | resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" 20 | integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== 21 | 22 | ioredis@^4.28.2: 23 | version "4.28.2" 24 | resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.28.2.tgz#493ccd5d869fd0ec86c96498192718171f6c9203" 25 | integrity sha512-kQ+Iv7+c6HsDdPP2XUHaMv8DhnSeAeKEwMbaoqsXYbO+03dItXt7+5jGQDRyjdRUV2rFJbzg7P4Qt1iX2tqkOg== 26 | dependencies: 27 | cluster-key-slot "^1.1.0" 28 | debug "^4.3.1" 29 | denque "^1.1.0" 30 | lodash.defaults "^4.2.0" 31 | lodash.flatten "^4.4.0" 32 | lodash.isarguments "^3.1.0" 33 | p-map "^2.1.0" 34 | redis-commands "1.7.0" 35 | redis-errors "^1.2.0" 36 | redis-parser "^3.0.0" 37 | standard-as-callback "^2.1.0" 38 | 39 | lodash.defaults@^4.2.0: 40 | version "4.2.0" 41 | resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" 42 | integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= 43 | 44 | lodash.flatten@^4.4.0: 45 | version "4.4.0" 46 | resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 47 | integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= 48 | 49 | lodash.isarguments@^3.1.0: 50 | version "3.1.0" 51 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 52 | integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= 53 | 54 | lodash@^4.17.21: 55 | version "4.17.21" 56 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 57 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 58 | 59 | ms@2.1.2: 60 | version "2.1.2" 61 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 62 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 63 | 64 | p-map@^2.1.0: 65 | version "2.1.0" 66 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" 67 | integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== 68 | 69 | redis-commands@1.7.0: 70 | version "1.7.0" 71 | resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" 72 | integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== 73 | 74 | redis-errors@^1.0.0, redis-errors@^1.2.0: 75 | version "1.2.0" 76 | resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" 77 | integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= 78 | 79 | redis-parser@^3.0.0: 80 | version "3.0.0" 81 | resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" 82 | integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= 83 | dependencies: 84 | redis-errors "^1.0.0" 85 | 86 | standard-as-callback@^2.1.0: 87 | version "2.1.0" 88 | resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" 89 | integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== 90 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2020-2021 Mikhail Volkov 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /provisioning/dashboards/pop-up.json: -------------------------------------------------------------------------------- 1 | { 2 | "__inputs": [], 3 | "__elements": [], 4 | "__requires": [ 5 | { 6 | "type": "panel", 7 | "id": "gauge", 8 | "name": "Gauge", 9 | "version": "" 10 | }, 11 | { 12 | "type": "grafana", 13 | "id": "grafana", 14 | "name": "Grafana", 15 | "version": "8.3.3" 16 | }, 17 | { 18 | "type": "panel", 19 | "id": "redis-cpu-panel", 20 | "name": "Redis CPU Usage", 21 | "version": "" 22 | }, 23 | { 24 | "type": "datasource", 25 | "id": "redis-datasource", 26 | "name": "Redis", 27 | "version": "2.1.0" 28 | }, 29 | { 30 | "type": "panel", 31 | "id": "redis-latency-panel", 32 | "name": "Redis Latency", 33 | "version": "" 34 | }, 35 | { 36 | "type": "panel", 37 | "id": "stat", 38 | "name": "Stat", 39 | "version": "" 40 | }, 41 | { 42 | "type": "panel", 43 | "id": "table", 44 | "name": "Table", 45 | "version": "" 46 | }, 47 | { 48 | "type": "panel", 49 | "id": "timeseries", 50 | "name": "Time series", 51 | "version": "" 52 | } 53 | ], 54 | "annotations": { 55 | "list": [ 56 | { 57 | "builtIn": 1, 58 | "datasource": "-- Grafana --", 59 | "enable": true, 60 | "hide": true, 61 | "iconColor": "rgba(0, 211, 255, 1)", 62 | "name": "Annotations & Alerts", 63 | "target": { 64 | "limit": 100, 65 | "matchAny": false, 66 | "tags": [], 67 | "type": "dashboard" 68 | }, 69 | "type": "dashboard" 70 | } 71 | ] 72 | }, 73 | "editable": true, 74 | "fiscalYearStartMonth": 0, 75 | "graphTooltip": 0, 76 | "id": null, 77 | "iteration": 1640405314558, 78 | "links": [], 79 | "liveNow": false, 80 | "panels": [ 81 | { 82 | "datasource": { 83 | "uid": "$redis" 84 | }, 85 | "fieldConfig": { 86 | "defaults": { 87 | "color": { 88 | "mode": "thresholds" 89 | }, 90 | "mappings": [], 91 | "max": 10000, 92 | "min": 0, 93 | "noValue": "0", 94 | "thresholds": { 95 | "mode": "absolute", 96 | "steps": [ 97 | { 98 | "color": "dark-red", 99 | "value": null 100 | }, 101 | { 102 | "color": "dark-yellow", 103 | "value": 1000 104 | }, 105 | { 106 | "color": "dark-green", 107 | "value": 5000 108 | } 109 | ] 110 | } 111 | }, 112 | "overrides": [] 113 | }, 114 | "gridPos": { 115 | "h": 4, 116 | "w": 3, 117 | "x": 0, 118 | "y": 0 119 | }, 120 | "id": 4, 121 | "options": { 122 | "orientation": "auto", 123 | "reduceOptions": { 124 | "calcs": ["mean"], 125 | "fields": "", 126 | "values": false 127 | }, 128 | "showThresholdLabels": false, 129 | "showThresholdMarkers": true, 130 | "text": {} 131 | }, 132 | "pluginVersion": "8.3.3", 133 | "targets": [ 134 | { 135 | "command": "get", 136 | "keyName": "product", 137 | "query": "", 138 | "refId": "A", 139 | "streaming": true, 140 | "streamingDataType": "DataFrame", 141 | "type": "command" 142 | } 143 | ], 144 | "title": "Product Available", 145 | "type": "gauge" 146 | }, 147 | { 148 | "datasource": { 149 | "uid": "$redis" 150 | }, 151 | "fieldConfig": { 152 | "defaults": { 153 | "color": { 154 | "mode": "palette-classic" 155 | }, 156 | "custom": { 157 | "axisLabel": "", 158 | "axisPlacement": "auto", 159 | "barAlignment": 0, 160 | "drawStyle": "line", 161 | "fillOpacity": 0, 162 | "gradientMode": "none", 163 | "hideFrom": { 164 | "graph": false, 165 | "legend": false, 166 | "tooltip": false, 167 | "viz": false 168 | }, 169 | "lineInterpolation": "linear", 170 | "lineWidth": 1, 171 | "pointSize": 5, 172 | "scaleDistribution": { 173 | "type": "linear" 174 | }, 175 | "showPoints": "auto", 176 | "spanNulls": false, 177 | "stacking": { 178 | "group": "A", 179 | "mode": "none" 180 | }, 181 | "thresholdsStyle": { 182 | "mode": "off" 183 | } 184 | }, 185 | "mappings": [], 186 | "thresholds": { 187 | "mode": "absolute", 188 | "steps": [ 189 | { 190 | "color": "dark-green", 191 | "value": null 192 | }, 193 | { 194 | "color": "dark-yellow", 195 | "value": 50 196 | }, 197 | { 198 | "color": "dark-red", 199 | "value": 100 200 | } 201 | ] 202 | } 203 | }, 204 | "overrides": [] 205 | }, 206 | "gridPos": { 207 | "h": 8, 208 | "w": 9, 209 | "x": 3, 210 | "y": 0 211 | }, 212 | "id": 2, 213 | "options": { 214 | "legend": { 215 | "calcs": [], 216 | "displayMode": "hidden", 217 | "placement": "bottom" 218 | }, 219 | "tooltip": { 220 | "mode": "single" 221 | } 222 | }, 223 | "pluginVersion": "7.5.1", 224 | "targets": [ 225 | { 226 | "command": "xlen", 227 | "keyName": "queue:customers", 228 | "query": "", 229 | "refId": "A", 230 | "streaming": true, 231 | "type": "command" 232 | } 233 | ], 234 | "title": "Customers Ordering", 235 | "type": "timeseries" 236 | }, 237 | { 238 | "datasource": { 239 | "uid": "$redis" 240 | }, 241 | "fieldConfig": { 242 | "defaults": { 243 | "color": { 244 | "mode": "palette-classic" 245 | }, 246 | "custom": { 247 | "axisLabel": "", 248 | "axisPlacement": "auto", 249 | "barAlignment": 0, 250 | "drawStyle": "line", 251 | "fillOpacity": 0, 252 | "gradientMode": "none", 253 | "hideFrom": { 254 | "graph": false, 255 | "legend": false, 256 | "tooltip": false, 257 | "viz": false 258 | }, 259 | "lineInterpolation": "linear", 260 | "lineWidth": 1, 261 | "pointSize": 5, 262 | "scaleDistribution": { 263 | "type": "linear" 264 | }, 265 | "showPoints": "auto", 266 | "spanNulls": false, 267 | "stacking": { 268 | "group": "A", 269 | "mode": "none" 270 | }, 271 | "thresholdsStyle": { 272 | "mode": "off" 273 | } 274 | }, 275 | "links": [], 276 | "mappings": [], 277 | "thresholds": { 278 | "mode": "absolute", 279 | "steps": [ 280 | { 281 | "color": "green", 282 | "value": null 283 | }, 284 | { 285 | "color": "red", 286 | "value": 80 287 | } 288 | ] 289 | } 290 | }, 291 | "overrides": [] 292 | }, 293 | "gridPos": { 294 | "h": 8, 295 | "w": 12, 296 | "x": 12, 297 | "y": 0 298 | }, 299 | "id": 13, 300 | "options": { 301 | "legend": { 302 | "calcs": [], 303 | "displayMode": "hidden", 304 | "placement": "bottom" 305 | }, 306 | "tooltip": { 307 | "mode": "single" 308 | } 309 | }, 310 | "pluginVersion": "7.5.1", 311 | "targets": [ 312 | { 313 | "aggregation": "", 314 | "bucket": 5000, 315 | "command": "ts.get", 316 | "keyName": "ts:enqueue:queue:customers", 317 | "legend": "Customers", 318 | "query": "", 319 | "refId": "A", 320 | "streaming": true, 321 | "streamingDataType": "TimeSeries", 322 | "type": "timeSeries" 323 | } 324 | ], 325 | "title": "Customers Overflow", 326 | "type": "timeseries" 327 | }, 328 | { 329 | "datasource": { 330 | "uid": "$redis" 331 | }, 332 | "fieldConfig": { 333 | "defaults": { 334 | "decimals": 0, 335 | "mappings": [], 336 | "min": 0, 337 | "thresholds": { 338 | "mode": "absolute", 339 | "steps": [ 340 | { 341 | "color": "dark-blue", 342 | "value": null 343 | } 344 | ] 345 | } 346 | }, 347 | "overrides": [] 348 | }, 349 | "gridPos": { 350 | "h": 4, 351 | "w": 3, 352 | "x": 0, 353 | "y": 4 354 | }, 355 | "id": 15, 356 | "options": { 357 | "colorMode": "background", 358 | "graphMode": "area", 359 | "justifyMode": "auto", 360 | "orientation": "auto", 361 | "reduceOptions": { 362 | "calcs": ["mean"], 363 | "fields": "", 364 | "values": false 365 | }, 366 | "text": {}, 367 | "textMode": "auto" 368 | }, 369 | "pluginVersion": "8.3.3", 370 | "targets": [ 371 | { 372 | "command": "xlen", 373 | "keyName": "queue:complete", 374 | "query": "", 375 | "refId": "A", 376 | "streaming": true, 377 | "streamingDataType": "TimeSeries", 378 | "type": "command" 379 | } 380 | ], 381 | "title": "Orders Completed", 382 | "type": "stat" 383 | }, 384 | { 385 | "datasource": { 386 | "uid": "$redis" 387 | }, 388 | "gridPos": { 389 | "h": 1, 390 | "w": 24, 391 | "x": 0, 392 | "y": 8 393 | }, 394 | "id": 8, 395 | "title": "Orders", 396 | "type": "row" 397 | }, 398 | { 399 | "datasource": { 400 | "uid": "$redis" 401 | }, 402 | "fieldConfig": { 403 | "defaults": { 404 | "color": { 405 | "mode": "palette-classic" 406 | }, 407 | "custom": { 408 | "axisLabel": "", 409 | "axisPlacement": "auto", 410 | "barAlignment": 0, 411 | "drawStyle": "line", 412 | "fillOpacity": 0, 413 | "gradientMode": "none", 414 | "hideFrom": { 415 | "graph": false, 416 | "legend": false, 417 | "tooltip": false, 418 | "viz": false 419 | }, 420 | "lineInterpolation": "linear", 421 | "lineWidth": 1, 422 | "pointSize": 5, 423 | "scaleDistribution": { 424 | "type": "linear" 425 | }, 426 | "showPoints": "auto", 427 | "spanNulls": false, 428 | "stacking": { 429 | "group": "A", 430 | "mode": "none" 431 | }, 432 | "thresholdsStyle": { 433 | "mode": "off" 434 | } 435 | }, 436 | "mappings": [], 437 | "thresholds": { 438 | "mode": "absolute", 439 | "steps": [ 440 | { 441 | "color": "dark-green", 442 | "value": null 443 | }, 444 | { 445 | "color": "dark-yellow", 446 | "value": 50 447 | }, 448 | { 449 | "color": "dark-red", 450 | "value": 100 451 | } 452 | ] 453 | } 454 | }, 455 | "overrides": [] 456 | }, 457 | "gridPos": { 458 | "h": 8, 459 | "w": 12, 460 | "x": 0, 461 | "y": 9 462 | }, 463 | "id": 3, 464 | "options": { 465 | "legend": { 466 | "calcs": [], 467 | "displayMode": "hidden", 468 | "placement": "bottom" 469 | }, 470 | "tooltip": { 471 | "mode": "multi" 472 | } 473 | }, 474 | "pluginVersion": "7.5.1", 475 | "targets": [ 476 | { 477 | "command": "xlen", 478 | "keyName": "orders", 479 | "query": "", 480 | "refId": "A", 481 | "streaming": true, 482 | "streamingDataType": "TimeSeries", 483 | "type": "command" 484 | } 485 | ], 486 | "title": "In Queue", 487 | "type": "timeseries" 488 | }, 489 | { 490 | "datasource": { 491 | "uid": "$redis" 492 | }, 493 | "fieldConfig": { 494 | "defaults": { 495 | "color": { 496 | "mode": "palette-classic" 497 | }, 498 | "custom": { 499 | "axisLabel": "", 500 | "axisPlacement": "auto", 501 | "barAlignment": 0, 502 | "drawStyle": "line", 503 | "fillOpacity": 10, 504 | "gradientMode": "none", 505 | "hideFrom": { 506 | "graph": false, 507 | "legend": false, 508 | "tooltip": false, 509 | "viz": false 510 | }, 511 | "lineInterpolation": "linear", 512 | "lineWidth": 1, 513 | "pointSize": 5, 514 | "scaleDistribution": { 515 | "type": "linear" 516 | }, 517 | "showPoints": "never", 518 | "spanNulls": true, 519 | "stacking": { 520 | "group": "A", 521 | "mode": "none" 522 | }, 523 | "thresholdsStyle": { 524 | "mode": "off" 525 | } 526 | }, 527 | "decimals": 0, 528 | "mappings": [], 529 | "min": 0, 530 | "thresholds": { 531 | "mode": "absolute", 532 | "steps": [ 533 | { 534 | "color": "green", 535 | "value": null 536 | }, 537 | { 538 | "color": "red", 539 | "value": 80 540 | } 541 | ] 542 | }, 543 | "unit": "short" 544 | }, 545 | "overrides": [] 546 | }, 547 | "gridPos": { 548 | "h": 8, 549 | "w": 12, 550 | "x": 12, 551 | "y": 9 552 | }, 553 | "id": 19, 554 | "options": { 555 | "graph": {}, 556 | "legend": { 557 | "calcs": [], 558 | "displayMode": "hidden", 559 | "placement": "bottom" 560 | }, 561 | "tooltip": { 562 | "mode": "single" 563 | } 564 | }, 565 | "pluginVersion": "7.5.1", 566 | "targets": [ 567 | { 568 | "command": "ts.get", 569 | "keyName": "ts:enqueue:queue:complete", 570 | "legend": "Orders", 571 | "query": "", 572 | "refId": "A", 573 | "streaming": true, 574 | "type": "timeSeries" 575 | } 576 | ], 577 | "title": "Completed Flow", 578 | "type": "timeseries" 579 | }, 580 | { 581 | "collapsed": false, 582 | "gridPos": { 583 | "h": 1, 584 | "w": 24, 585 | "x": 0, 586 | "y": 17 587 | }, 588 | "id": 23, 589 | "panels": [], 590 | "title": "Redis Performance", 591 | "type": "row" 592 | }, 593 | { 594 | "gridPos": { 595 | "h": 9, 596 | "w": 12, 597 | "x": 0, 598 | "y": 18 599 | }, 600 | "id": 31, 601 | "options": { 602 | "interval": 1000, 603 | "maxItemsPerSeries": 300 604 | }, 605 | "title": "CPU Usage", 606 | "type": "redis-cpu-panel" 607 | }, 608 | { 609 | "datasource": { 610 | "uid": "$redis" 611 | }, 612 | "fieldConfig": { 613 | "defaults": { 614 | "color": { 615 | "mode": "palette-classic" 616 | }, 617 | "custom": { 618 | "axisLabel": "", 619 | "axisPlacement": "auto", 620 | "barAlignment": 0, 621 | "drawStyle": "line", 622 | "fillOpacity": 51, 623 | "gradientMode": "opacity", 624 | "hideFrom": { 625 | "legend": false, 626 | "tooltip": false, 627 | "viz": false 628 | }, 629 | "lineInterpolation": "linear", 630 | "lineWidth": 1, 631 | "pointSize": 5, 632 | "scaleDistribution": { 633 | "type": "linear" 634 | }, 635 | "showPoints": "never", 636 | "spanNulls": true, 637 | "stacking": { 638 | "group": "A", 639 | "mode": "none" 640 | }, 641 | "thresholdsStyle": { 642 | "mode": "off" 643 | } 644 | }, 645 | "mappings": [], 646 | "thresholds": { 647 | "mode": "absolute", 648 | "steps": [ 649 | { 650 | "color": "green", 651 | "value": null 652 | }, 653 | { 654 | "color": "red", 655 | "value": 80 656 | } 657 | ] 658 | }, 659 | "unit": "ops" 660 | }, 661 | "overrides": [] 662 | }, 663 | "gridPos": { 664 | "h": 9, 665 | "w": 12, 666 | "x": 12, 667 | "y": 18 668 | }, 669 | "id": 25, 670 | "options": { 671 | "legend": { 672 | "calcs": [], 673 | "displayMode": "hidden", 674 | "placement": "bottom" 675 | }, 676 | "tooltip": { 677 | "mode": "multi" 678 | } 679 | }, 680 | "pluginVersion": "8.0.0", 681 | "targets": [ 682 | { 683 | "command": "info", 684 | "query": "", 685 | "refId": "A", 686 | "section": "stats", 687 | "streaming": true, 688 | "streamingCapacity": 1000, 689 | "streamingInterval": 1000, 690 | "type": "command" 691 | } 692 | ], 693 | "title": "Ops/sec", 694 | "transformations": [ 695 | { 696 | "id": "filterFieldsByName", 697 | "options": { 698 | "include": { 699 | "names": ["instantaneous_ops_per_sec", "#time"] 700 | } 701 | } 702 | } 703 | ], 704 | "type": "timeseries" 705 | }, 706 | { 707 | "datasource": { 708 | "uid": "$redis" 709 | }, 710 | "gridPos": { 711 | "h": 10, 712 | "w": 12, 713 | "x": 0, 714 | "y": 27 715 | }, 716 | "id": 29, 717 | "options": { 718 | "hideZero": true, 719 | "interval": 1000, 720 | "maxItemsPerSeries": 300, 721 | "viewMode": "Graph" 722 | }, 723 | "pluginVersion": "7.3.7", 724 | "title": "Latency", 725 | "type": "redis-latency-panel" 726 | }, 727 | { 728 | "datasource": { 729 | "uid": "$redis" 730 | }, 731 | "fieldConfig": { 732 | "defaults": { 733 | "color": { 734 | "mode": "palette-classic" 735 | }, 736 | "custom": { 737 | "axisLabel": "", 738 | "axisPlacement": "auto", 739 | "barAlignment": 0, 740 | "drawStyle": "line", 741 | "fillOpacity": 52, 742 | "gradientMode": "opacity", 743 | "hideFrom": { 744 | "legend": false, 745 | "tooltip": false, 746 | "viz": false 747 | }, 748 | "lineInterpolation": "linear", 749 | "lineWidth": 1, 750 | "pointSize": 5, 751 | "scaleDistribution": { 752 | "type": "linear" 753 | }, 754 | "showPoints": "never", 755 | "spanNulls": true, 756 | "stacking": { 757 | "group": "A", 758 | "mode": "none" 759 | }, 760 | "thresholdsStyle": { 761 | "mode": "off" 762 | } 763 | }, 764 | "mappings": [], 765 | "thresholds": { 766 | "mode": "absolute", 767 | "steps": [ 768 | { 769 | "color": "green", 770 | "value": null 771 | }, 772 | { 773 | "color": "red", 774 | "value": 80 775 | } 776 | ] 777 | }, 778 | "unit": "decbytes" 779 | }, 780 | "overrides": [] 781 | }, 782 | "gridPos": { 783 | "h": 10, 784 | "w": 12, 785 | "x": 12, 786 | "y": 27 787 | }, 788 | "id": 27, 789 | "options": { 790 | "legend": { 791 | "calcs": ["mean", "lastNotNull"], 792 | "displayMode": "table", 793 | "placement": "bottom" 794 | }, 795 | "tooltip": { 796 | "mode": "multi" 797 | } 798 | }, 799 | "pluginVersion": "8.0.0", 800 | "targets": [ 801 | { 802 | "command": "info", 803 | "query": "", 804 | "refId": "A", 805 | "section": "memory", 806 | "streaming": true, 807 | "streamingCapacity": 1000, 808 | "streamingInterval": 1000, 809 | "type": "command" 810 | } 811 | ], 812 | "title": "Memory Usage", 813 | "transformations": [ 814 | { 815 | "id": "filterFieldsByName", 816 | "options": { 817 | "include": { 818 | "names": [ 819 | "used_memory", 820 | "used_memory_rss", 821 | "used_memory_peak", 822 | "total_system_memory", 823 | "used_memory_lua", 824 | "maxmemory", 825 | "#time" 826 | ] 827 | } 828 | } 829 | }, 830 | { 831 | "id": "organize", 832 | "options": { 833 | "excludeByName": {}, 834 | "indexByName": {}, 835 | "renameByName": { 836 | "maxmemory": "Memory Limit", 837 | "total_system_memory": "Total System Memory", 838 | "used_memory": "Used Memory", 839 | "used_memory_lua": "Used Memory, LUA", 840 | "used_memory_peak": "Used Memory, Peak", 841 | "used_memory_rss": "Used Memory, RSS" 842 | } 843 | } 844 | } 845 | ], 846 | "type": "timeseries" 847 | }, 848 | { 849 | "datasource": { 850 | "uid": "$redis" 851 | }, 852 | "fieldConfig": { 853 | "defaults": { 854 | "custom": { 855 | "displayMode": "auto", 856 | "filterable": false 857 | }, 858 | "mappings": [], 859 | "thresholds": { 860 | "mode": "absolute", 861 | "steps": [ 862 | { 863 | "color": "green", 864 | "value": null 865 | } 866 | ] 867 | } 868 | }, 869 | "overrides": [ 870 | { 871 | "matcher": { 872 | "id": "byName", 873 | "options": "id" 874 | }, 875 | "properties": [ 876 | { 877 | "id": "custom.width", 878 | "value": 176 879 | } 880 | ] 881 | }, 882 | { 883 | "matcher": { 884 | "id": "byName", 885 | "options": "PD" 886 | }, 887 | "properties": [ 888 | { 889 | "id": "custom.width", 890 | "value": 242 891 | } 892 | ] 893 | }, 894 | { 895 | "matcher": { 896 | "id": "byName", 897 | "options": "Triggered" 898 | }, 899 | "properties": [ 900 | { 901 | "id": "custom.width", 902 | "value": 90 903 | } 904 | ] 905 | }, 906 | { 907 | "matcher": { 908 | "id": "byName", 909 | "options": "Mode" 910 | }, 911 | "properties": [ 912 | { 913 | "id": "custom.width", 914 | "value": 92 915 | } 916 | ] 917 | }, 918 | { 919 | "matcher": { 920 | "id": "byName", 921 | "options": "Success" 922 | }, 923 | "properties": [ 924 | { 925 | "id": "custom.width", 926 | "value": 88 927 | } 928 | ] 929 | }, 930 | { 931 | "matcher": { 932 | "id": "byName", 933 | "options": "Failures" 934 | }, 935 | "properties": [ 936 | { 937 | "id": "custom.width", 938 | "value": 84 939 | } 940 | ] 941 | }, 942 | { 943 | "matcher": { 944 | "id": "byName", 945 | "options": "Aborted" 946 | }, 947 | "properties": [ 948 | { 949 | "id": "custom.width" 950 | } 951 | ] 952 | }, 953 | { 954 | "matcher": { 955 | "id": "byName", 956 | "options": "Status" 957 | }, 958 | "properties": [ 959 | { 960 | "id": "custom.width", 961 | "value": 94 962 | } 963 | ] 964 | }, 965 | { 966 | "matcher": { 967 | "id": "byName", 968 | "options": "Reader" 969 | }, 970 | "properties": [ 971 | { 972 | "id": "custom.width", 973 | "value": 154 974 | } 975 | ] 976 | }, 977 | { 978 | "matcher": { 979 | "id": "byName", 980 | "options": "Args" 981 | }, 982 | "properties": [ 983 | { 984 | "id": "custom.width", 985 | "value": 147 986 | } 987 | ] 988 | } 989 | ] 990 | }, 991 | "gridPos": { 992 | "h": 5, 993 | "w": 24, 994 | "x": 0, 995 | "y": 37 996 | }, 997 | "id": 21, 998 | "options": { 999 | "footer": { 1000 | "fields": "", 1001 | "reducer": ["sum"], 1002 | "show": false 1003 | }, 1004 | "showHeader": true, 1005 | "sortBy": [] 1006 | }, 1007 | "pluginVersion": "8.3.3", 1008 | "targets": [ 1009 | { 1010 | "command": "rg.dumpregistrations", 1011 | "query": "", 1012 | "refId": "A", 1013 | "streaming": true, 1014 | "streamingDataType": "DataFrame", 1015 | "type": "gears" 1016 | } 1017 | ], 1018 | "title": "Registrations", 1019 | "transformations": [ 1020 | { 1021 | "id": "organize", 1022 | "options": { 1023 | "excludeByName": { 1024 | "PD": true, 1025 | "desc": true, 1026 | "id": true 1027 | }, 1028 | "indexByName": { 1029 | "PD": 4, 1030 | "args": 1, 1031 | "desc": 3, 1032 | "id": 2, 1033 | "lastError": 10, 1034 | "mode": 5, 1035 | "numAborted": 9, 1036 | "numFailures": 8, 1037 | "numSuccess": 7, 1038 | "numTriggered": 6, 1039 | "reader": 0, 1040 | "status": 11 1041 | }, 1042 | "renameByName": { 1043 | "args": "Args", 1044 | "lastError": "Last Error", 1045 | "mode": "Mode", 1046 | "numAborted": "Aborted", 1047 | "numFailures": "Failures", 1048 | "numSuccess": "Success", 1049 | "numTriggered": "Triggered", 1050 | "reader": "Reader", 1051 | "status": "Status" 1052 | } 1053 | } 1054 | } 1055 | ], 1056 | "type": "table" 1057 | } 1058 | ], 1059 | "refresh": false, 1060 | "schemaVersion": 34, 1061 | "style": "dark", 1062 | "tags": [], 1063 | "templating": { 1064 | "list": [ 1065 | { 1066 | "current": { 1067 | "selected": false, 1068 | "text": "Redis", 1069 | "value": "Redis" 1070 | }, 1071 | "hide": 0, 1072 | "includeAll": false, 1073 | "label": "Redis", 1074 | "multi": false, 1075 | "name": "redis", 1076 | "options": [], 1077 | "query": "redis-datasource", 1078 | "queryValue": "", 1079 | "refresh": 1, 1080 | "regex": "", 1081 | "skipUrlSync": false, 1082 | "type": "datasource" 1083 | } 1084 | ] 1085 | }, 1086 | "time": { 1087 | "from": "now-5m", 1088 | "to": "now" 1089 | }, 1090 | "timepicker": { 1091 | "refresh_intervals": [ 1092 | "10s", 1093 | "30s", 1094 | "1m", 1095 | "5m", 1096 | "15m", 1097 | "30m", 1098 | "1h", 1099 | "2h", 1100 | "1d" 1101 | ] 1102 | }, 1103 | "timezone": "", 1104 | "title": "Pop-up Store", 1105 | "uid": "0LC0Sm7Ml", 1106 | "version": 1, 1107 | "weekStart": "" 1108 | } 1109 | -------------------------------------------------------------------------------- /images/pop-up.excalidraw: -------------------------------------------------------------------------------- 1 | { 2 | "type": "excalidraw", 3 | "version": 2, 4 | "source": "https://excalidraw.com", 5 | "elements": [ 6 | { 7 | "type": "rectangle", 8 | "version": 1366, 9 | "versionNonce": 383345064, 10 | "isDeleted": false, 11 | "id": "Fe6BusyrD_Dp7meDEO-bp", 12 | "fillStyle": "hachure", 13 | "strokeWidth": 2, 14 | "strokeStyle": "solid", 15 | "roughness": 2, 16 | "opacity": 100, 17 | "angle": 0, 18 | "x": 971.6139322916665, 19 | "y": -885.42345610119, 20 | "strokeColor": "#000000", 21 | "backgroundColor": "#ced4da", 22 | "width": 1089.5238095238096, 23 | "height": 680.1428571428572, 24 | "seed": 347593339, 25 | "groupIds": [], 26 | "strokeSharpness": "sharp", 27 | "boundElementIds": [] 28 | }, 29 | { 30 | "type": "arrow", 31 | "version": 2166, 32 | "versionNonce": 1804859560, 33 | "isDeleted": false, 34 | "id": "-maJWYqX4w-3xneaGuO09", 35 | "fillStyle": "solid", 36 | "strokeWidth": 2, 37 | "strokeStyle": "solid", 38 | "roughness": 2, 39 | "opacity": 100, 40 | "angle": 0, 41 | "x": 1682.7321708690877, 42 | "y": -585.9832288912409, 43 | "strokeColor": "#dc372d", 44 | "backgroundColor": "#ffffff", 45 | "width": 2.639831858818325, 46 | "height": 235.76384184265328, 47 | "seed": 1465587263, 48 | "groupIds": [], 49 | "strokeSharpness": "round", 50 | "boundElementIds": [], 51 | "startBinding": { 52 | "elementId": "opJK194qGl3IWRUNIv84Y", 53 | "focus": -1.1176110456703259, 54 | "gap": 13.934495797579302 55 | }, 56 | "points": [ 57 | [ 58 | 0, 59 | 0 60 | ], 61 | [ 62 | -2.639831858818325, 63 | -235.76384184265328 64 | ] 65 | ], 66 | "lastCommittedPoint": null 67 | }, 68 | { 69 | "type": "arrow", 70 | "version": 2257, 71 | "versionNonce": 1111705048, 72 | "isDeleted": false, 73 | "id": "jRSy3RKldVzZsVqqnsZTa", 74 | "fillStyle": "solid", 75 | "strokeWidth": 2, 76 | "strokeStyle": "solid", 77 | "roughness": 2, 78 | "opacity": 100, 79 | "angle": 0, 80 | "x": 1666.0126741920374, 81 | "y": -602.4774238271544, 82 | "strokeColor": "#dc372d", 83 | "backgroundColor": "#ffffff", 84 | "width": 260.96342784978447, 85 | "height": 0.23581624545275404, 86 | "seed": 488542577, 87 | "groupIds": [], 88 | "strokeSharpness": "round", 89 | "boundElementIds": [], 90 | "endBinding": { 91 | "elementId": "opJK194qGl3IWRUNIv84Y", 92 | "focus": 0.914680497080373, 93 | "gap": 1 94 | }, 95 | "points": [ 96 | [ 97 | 0, 98 | 0 99 | ], 100 | [ 101 | 260.96342784978447, 102 | 0.23581624545275404 103 | ] 104 | ], 105 | "lastCommittedPoint": null 106 | }, 107 | { 108 | "type": "line", 109 | "version": 2073, 110 | "versionNonce": 1792975784, 111 | "isDeleted": false, 112 | "id": "ikjao1lNJIb-E8Gh6Cwc8", 113 | "fillStyle": "solid", 114 | "strokeWidth": 2, 115 | "strokeStyle": "solid", 116 | "roughness": 2, 117 | "opacity": 100, 118 | "angle": 0, 119 | "x": 1711.8440277260477, 120 | "y": -664.5999957588834, 121 | "strokeColor": "#dc372d", 122 | "backgroundColor": "#ffffff", 123 | "width": 22.304286549073023, 124 | "height": 17.09667779532462, 125 | "seed": 962502143, 126 | "groupIds": [], 127 | "strokeSharpness": "round", 128 | "boundElementIds": [], 129 | "points": [ 130 | [ 131 | 0, 132 | 0 133 | ], 134 | [ 135 | 22.304286549073023, 136 | 17.09667779532462 137 | ] 138 | ], 139 | "lastCommittedPoint": null 140 | }, 141 | { 142 | "type": "line", 143 | "version": 2114, 144 | "versionNonce": 848087768, 145 | "isDeleted": false, 146 | "id": "xpySzrjDON33YdZrCP3EG", 147 | "fillStyle": "solid", 148 | "strokeWidth": 2, 149 | "strokeStyle": "solid", 150 | "roughness": 2, 151 | "opacity": 100, 152 | "angle": 0, 153 | "x": 1732.9447108343509, 154 | "y": -646.701619115213, 155 | "strokeColor": "#dc372d", 156 | "backgroundColor": "#ffffff", 157 | "width": 38.30048853228475, 158 | "height": 50.72341935176107, 159 | "seed": 901766545, 160 | "groupIds": [], 161 | "strokeSharpness": "round", 162 | "boundElementIds": [], 163 | "points": [ 164 | [ 165 | 0, 166 | 0 167 | ], 168 | [ 169 | 38.30048853228475, 170 | -50.72341935176107 171 | ] 172 | ], 173 | "lastCommittedPoint": null 174 | }, 175 | { 176 | "type": "line", 177 | "version": 2086, 178 | "versionNonce": 563867304, 179 | "isDeleted": false, 180 | "id": "G2lWLbmo7YZ3_KOVuHvSI", 181 | "fillStyle": "solid", 182 | "strokeWidth": 2, 183 | "strokeStyle": "solid", 184 | "roughness": 2, 185 | "opacity": 100, 186 | "angle": 0, 187 | "x": 1770.7316327016767, 188 | "y": -696.6244159403446, 189 | "strokeColor": "#dc372d", 190 | "backgroundColor": "#ffffff", 191 | "width": 34.74031827107443, 192 | "height": 17.227686820576196, 193 | "seed": 360267505, 194 | "groupIds": [], 195 | "strokeSharpness": "round", 196 | "boundElementIds": [], 197 | "points": [ 198 | [ 199 | 0, 200 | 0 201 | ], 202 | [ 203 | 34.74031827107443, 204 | 17.227686820576196 205 | ] 206 | ], 207 | "lastCommittedPoint": null 208 | }, 209 | { 210 | "type": "line", 211 | "version": 2102, 212 | "versionNonce": 1230876632, 213 | "isDeleted": false, 214 | "id": "FVuWAAbK8FfDan70wZ2Li", 215 | "fillStyle": "solid", 216 | "strokeWidth": 2, 217 | "strokeStyle": "solid", 218 | "roughness": 2, 219 | "opacity": 100, 220 | "angle": 0, 221 | "x": 1805.3752065814458, 222 | "y": -681.2132544685352, 223 | "strokeColor": "#dc372d", 224 | "backgroundColor": "#ffffff", 225 | "width": 58.62653880005961, 226 | "height": 79.98428514169022, 227 | "seed": 1943272433, 228 | "groupIds": [], 229 | "strokeSharpness": "round", 230 | "boundElementIds": [], 231 | "points": [ 232 | [ 233 | 0, 234 | 0 235 | ], 236 | [ 237 | 58.62653880005961, 238 | -79.98428514169022 239 | ] 240 | ], 241 | "lastCommittedPoint": null 242 | }, 243 | { 244 | "type": "ellipse", 245 | "version": 2129, 246 | "versionNonce": 1215814056, 247 | "isDeleted": false, 248 | "id": "sHAv3iJR1yGX0r9XAroXy", 249 | "fillStyle": "solid", 250 | "strokeWidth": 2, 251 | "strokeStyle": "solid", 252 | "roughness": 2, 253 | "opacity": 100, 254 | "angle": 0, 255 | "x": 1059.2134717834274, 256 | "y": -826.6862286390199, 257 | "strokeColor": "#dc372d", 258 | "backgroundColor": "#ffffff", 259 | "width": 200.9474579549087, 260 | "height": 200.9474579549087, 261 | "seed": 2039340898, 262 | "groupIds": [], 263 | "strokeSharpness": "sharp", 264 | "boundElementIds": [] 265 | }, 266 | { 267 | "type": "ellipse", 268 | "version": 2045, 269 | "versionNonce": 2127164632, 270 | "isDeleted": false, 271 | "id": "dqdTB37IZtghc85KPYtx1", 272 | "fillStyle": "solid", 273 | "strokeWidth": 2, 274 | "strokeStyle": "solid", 275 | "roughness": 2, 276 | "opacity": 100, 277 | "angle": 0, 278 | "x": 1102.3164823664615, 279 | "y": -785.6747386836948, 280 | "strokeColor": "#dc372d", 281 | "backgroundColor": "transparent", 282 | "width": 114.31467430783472, 283 | "height": 117.15206810056274, 284 | "seed": 374063038, 285 | "groupIds": [], 286 | "strokeSharpness": "sharp", 287 | "boundElementIds": [] 288 | }, 289 | { 290 | "type": "line", 291 | "version": 1744, 292 | "versionNonce": 580805800, 293 | "isDeleted": false, 294 | "id": "0NP90Yvu4BF8X1Ml72NuH", 295 | "fillStyle": "solid", 296 | "strokeWidth": 2, 297 | "strokeStyle": "solid", 298 | "roughness": 2, 299 | "opacity": 100, 300 | "angle": 0, 301 | "x": 1172.3588445034607, 302 | "y": -826.4837978821732, 303 | "strokeColor": "#dc372d", 304 | "backgroundColor": "#ffffff", 305 | "width": 0.12956163727913894, 306 | "height": 19.865113362357263, 307 | "seed": 354394914, 308 | "groupIds": [], 309 | "strokeSharpness": "round", 310 | "boundElementIds": [], 311 | "points": [ 312 | [ 313 | 0, 314 | 0 315 | ], 316 | [ 317 | 0.12956163727913894, 318 | -19.865113362357263 319 | ] 320 | ], 321 | "lastCommittedPoint": null 322 | }, 323 | { 324 | "type": "line", 325 | "version": 1784, 326 | "versionNonce": 677747160, 327 | "isDeleted": false, 328 | "id": "Nq_zKb--DoCGymG24WCRC", 329 | "fillStyle": "solid", 330 | "strokeWidth": 2, 331 | "strokeStyle": "solid", 332 | "roughness": 2, 333 | "opacity": 100, 334 | "angle": 0, 335 | "x": 1176.314132814593, 336 | "y": -619.880817188115, 337 | "strokeColor": "#dc372d", 338 | "backgroundColor": "#ffffff", 339 | "width": 0.3344895121508637, 340 | "height": 26.789918628358798, 341 | "seed": 142153726, 342 | "groupIds": [], 343 | "strokeSharpness": "round", 344 | "boundElementIds": [], 345 | "points": [ 346 | [ 347 | 0, 348 | 0 349 | ], 350 | [ 351 | 0.3344895121508637, 352 | 26.789918628358798 353 | ] 354 | ], 355 | "lastCommittedPoint": null 356 | }, 357 | { 358 | "type": "line", 359 | "version": 1747, 360 | "versionNonce": 767266728, 361 | "isDeleted": false, 362 | "id": "boBCqbE3zWpV0TRRzEllc", 363 | "fillStyle": "solid", 364 | "strokeWidth": 2, 365 | "strokeStyle": "solid", 366 | "roughness": 2, 367 | "opacity": 100, 368 | "angle": 0, 369 | "x": 1152.3150430188282, 370 | "y": -827.8447208256348, 371 | "strokeColor": "#dc372d", 372 | "backgroundColor": "#ffffff", 373 | "width": 1.8108498605758732, 374 | "height": 16.475419363775163, 375 | "seed": 692252386, 376 | "groupIds": [], 377 | "strokeSharpness": "round", 378 | "boundElementIds": [], 379 | "points": [ 380 | [ 381 | 0, 382 | 0 383 | ], 384 | [ 385 | -1.8108498605758732, 386 | -16.475419363775163 387 | ] 388 | ], 389 | "lastCommittedPoint": null 390 | }, 391 | { 392 | "type": "line", 393 | "version": 1782, 394 | "versionNonce": 1229233880, 395 | "isDeleted": false, 396 | "id": "sfbaSI77SYZqdhkE7vntZ", 397 | "fillStyle": "solid", 398 | "strokeWidth": 2, 399 | "strokeStyle": "solid", 400 | "roughness": 2, 401 | "opacity": 100, 402 | "angle": 0, 403 | "x": 1145.3401880087806, 404 | "y": -623.43367753207, 405 | "strokeColor": "#dc372d", 406 | "backgroundColor": "#ffffff", 407 | "width": 0.07689414072433645, 408 | "height": 28.6353780057429, 409 | "seed": 869361726, 410 | "groupIds": [], 411 | "strokeSharpness": "round", 412 | "boundElementIds": [], 413 | "points": [ 414 | [ 415 | 0, 416 | 0 417 | ], 418 | [ 419 | 0.07689414072433645, 420 | 28.6353780057429 421 | ] 422 | ], 423 | "lastCommittedPoint": null 424 | }, 425 | { 426 | "type": "line", 427 | "version": 1804, 428 | "versionNonce": 1375427240, 429 | "isDeleted": false, 430 | "id": "xVht_yBJz-uTzLKCsSdCq", 431 | "fillStyle": "solid", 432 | "strokeWidth": 2, 433 | "strokeStyle": "solid", 434 | "roughness": 2, 435 | "opacity": 100, 436 | "angle": 0, 437 | "x": 1262.3689511974974, 438 | "y": -736.4455197278651, 439 | "strokeColor": "#dc372d", 440 | "backgroundColor": "#ffffff", 441 | "width": 34.2102032082573, 442 | "height": 1.7301181662975678, 443 | "seed": 981910178, 444 | "groupIds": [], 445 | "strokeSharpness": "round", 446 | "boundElementIds": [], 447 | "points": [ 448 | [ 449 | 0, 450 | 0 451 | ], 452 | [ 453 | 34.2102032082573, 454 | 1.7301181662975678 455 | ] 456 | ], 457 | "lastCommittedPoint": null 458 | }, 459 | { 460 | "type": "line", 461 | "version": 1774, 462 | "versionNonce": 1643840472, 463 | "isDeleted": false, 464 | "id": "1p-iSNlCcNVaMJC7ragv2", 465 | "fillStyle": "solid", 466 | "strokeWidth": 2, 467 | "strokeStyle": "solid", 468 | "roughness": 2, 469 | "opacity": 100, 470 | "angle": 0, 471 | "x": 1261.6694888035918, 472 | "y": -700.3683964577726, 473 | "strokeColor": "#dc372d", 474 | "backgroundColor": "#ffffff", 475 | "width": 38.86229872207963, 476 | "height": 0.488277793599536, 477 | "seed": 674607230, 478 | "groupIds": [], 479 | "strokeSharpness": "round", 480 | "boundElementIds": [], 481 | "points": [ 482 | [ 483 | 0, 484 | 0 485 | ], 486 | [ 487 | 38.86229872207963, 488 | 0.488277793599536 489 | ] 490 | ], 491 | "lastCommittedPoint": null 492 | }, 493 | { 494 | "type": "line", 495 | "version": 1782, 496 | "versionNonce": 302630312, 497 | "isDeleted": false, 498 | "id": "5uYoxPaIYZDYrLQg-NT7Z", 499 | "fillStyle": "solid", 500 | "strokeWidth": 2, 501 | "strokeStyle": "solid", 502 | "roughness": 2, 503 | "opacity": 100, 504 | "angle": 0, 505 | "x": 1059.4690626444471, 506 | "y": -739.7893855633798, 507 | "strokeColor": "#dc372d", 508 | "backgroundColor": "#ffffff", 509 | "width": 30.530818574597756, 510 | "height": 0.23837183624544303, 511 | "seed": 1671044706, 512 | "groupIds": [], 513 | "strokeSharpness": "round", 514 | "boundElementIds": [], 515 | "points": [ 516 | [ 517 | 0, 518 | 0 519 | ], 520 | [ 521 | -30.530818574597756, 522 | -0.23837183624544303 523 | ] 524 | ], 525 | "lastCommittedPoint": null 526 | }, 527 | { 528 | "type": "line", 529 | "version": 1806, 530 | "versionNonce": 1084016856, 531 | "isDeleted": false, 532 | "id": "sM35pDZiqN61dhrwznUuz", 533 | "fillStyle": "solid", 534 | "strokeWidth": 2, 535 | "strokeStyle": "solid", 536 | "roughness": 2, 537 | "opacity": 100, 538 | "angle": 0, 539 | "x": 1057.0161639324851, 540 | "y": -705.3210433183091, 541 | "strokeColor": "#dc372d", 542 | "backgroundColor": "#ffffff", 543 | "width": 28.02791429402061, 544 | "height": 0.35371304733194786, 545 | "seed": 1365700798, 546 | "groupIds": [], 547 | "strokeSharpness": "round", 548 | "boundElementIds": [], 549 | "points": [ 550 | [ 551 | 0, 552 | 0 553 | ], 554 | [ 555 | -28.02791429402061, 556 | 0.35371304733194786 557 | ] 558 | ], 559 | "lastCommittedPoint": null 560 | }, 561 | { 562 | "type": "line", 563 | "version": 1797, 564 | "versionNonce": 991088808, 565 | "isDeleted": false, 566 | "id": "G6nS3ffBHiX-_6ZR1FtL_", 567 | "fillStyle": "solid", 568 | "strokeWidth": 2, 569 | "strokeStyle": "solid", 570 | "roughness": 2, 571 | "opacity": 100, 572 | "angle": 0, 573 | "x": 1225.525589356729, 574 | "y": -806.894876720098, 575 | "strokeColor": "#dc372d", 576 | "backgroundColor": "#ffffff", 577 | "width": 17.15123808856324, 578 | "height": 21.68799239129909, 579 | "seed": 290193954, 580 | "groupIds": [], 581 | "strokeSharpness": "round", 582 | "boundElementIds": [], 583 | "points": [ 584 | [ 585 | 0, 586 | 0 587 | ], 588 | [ 589 | 17.15123808856324, 590 | -21.68799239129909 591 | ] 592 | ], 593 | "lastCommittedPoint": null 594 | }, 595 | { 596 | "type": "line", 597 | "version": 1790, 598 | "versionNonce": 1354624472, 599 | "isDeleted": false, 600 | "id": "Ch7cmh7eGCnDGkVtyK57i", 601 | "fillStyle": "solid", 602 | "strokeWidth": 2, 603 | "strokeStyle": "solid", 604 | "roughness": 2, 605 | "opacity": 100, 606 | "angle": 0, 607 | "x": 1244.2238350963846, 608 | "y": -777.2197939650275, 609 | "strokeColor": "#dc372d", 610 | "backgroundColor": "#ffffff", 611 | "width": 25.36737702495858, 612 | "height": 20.703747390027587, 613 | "seed": 2064001278, 614 | "groupIds": [], 615 | "strokeSharpness": "round", 616 | "boundElementIds": [], 617 | "points": [ 618 | [ 619 | 0, 620 | 0 621 | ], 622 | [ 623 | 25.36737702495858, 624 | -20.703747390027587 625 | ] 626 | ], 627 | "lastCommittedPoint": null 628 | }, 629 | { 630 | "type": "line", 631 | "version": 1795, 632 | "versionNonce": 348289960, 633 | "isDeleted": false, 634 | "id": "JnAoQ4Zxs2LJBGYF_tDlf", 635 | "fillStyle": "solid", 636 | "strokeWidth": 2, 637 | "strokeStyle": "solid", 638 | "roughness": 2, 639 | "opacity": 100, 640 | "angle": 0, 641 | "x": 1243.7491494000221, 642 | "y": -665.0864135089689, 643 | "strokeColor": "#dc372d", 644 | "backgroundColor": "#ffffff", 645 | "width": 33.73345953576638, 646 | "height": 15.959378907336013, 647 | "seed": 1049325026, 648 | "groupIds": [], 649 | "strokeSharpness": "round", 650 | "boundElementIds": [], 651 | "points": [ 652 | [ 653 | 0, 654 | 0 655 | ], 656 | [ 657 | 33.73345953576638, 658 | 15.959378907336013 659 | ] 660 | ], 661 | "lastCommittedPoint": null 662 | }, 663 | { 664 | "type": "line", 665 | "version": 1793, 666 | "versionNonce": 1802662616, 667 | "isDeleted": false, 668 | "id": "t5n4Rjro_wXtMSl2DJ9nu", 669 | "fillStyle": "solid", 670 | "strokeWidth": 2, 671 | "strokeStyle": "solid", 672 | "roughness": 2, 673 | "opacity": 100, 674 | "angle": 0, 675 | "x": 1219.9510593457223, 676 | "y": -642.378794521431, 677 | "strokeColor": "#dc372d", 678 | "backgroundColor": "#ffffff", 679 | "width": 25.56730179084186, 680 | "height": 21.14973340622874, 681 | "seed": 1419008318, 682 | "groupIds": [], 683 | "strokeSharpness": "round", 684 | "boundElementIds": [], 685 | "points": [ 686 | [ 687 | 0, 688 | 0 689 | ], 690 | [ 691 | 25.56730179084186, 692 | 21.14973340622874 693 | ] 694 | ], 695 | "lastCommittedPoint": null 696 | }, 697 | { 698 | "type": "line", 699 | "version": 1789, 700 | "versionNonce": 289719976, 701 | "isDeleted": false, 702 | "id": "x3vtx3ZNdOeJa78o-I0Bo", 703 | "fillStyle": "solid", 704 | "strokeWidth": 2, 705 | "strokeStyle": "solid", 706 | "roughness": 2, 707 | "opacity": 100, 708 | "angle": 0, 709 | "x": 1104.0799696690117, 710 | "y": -807.5073612692482, 711 | "strokeColor": "#dc372d", 712 | "backgroundColor": "#ffffff", 713 | "width": 19.227379888120293, 714 | "height": 24.283169640745424, 715 | "seed": 812081570, 716 | "groupIds": [], 717 | "strokeSharpness": "round", 718 | "boundElementIds": [], 719 | "points": [ 720 | [ 721 | 0, 722 | 0 723 | ], 724 | [ 725 | -19.227379888120293, 726 | -24.283169640745424 727 | ] 728 | ], 729 | "lastCommittedPoint": null 730 | }, 731 | { 732 | "type": "line", 733 | "version": 1774, 734 | "versionNonce": 659445720, 735 | "isDeleted": false, 736 | "id": "E7oTo0r9-tmA2fYV6SjHL", 737 | "fillStyle": "solid", 738 | "strokeWidth": 2, 739 | "strokeStyle": "solid", 740 | "roughness": 2, 741 | "opacity": 100, 742 | "angle": 0, 743 | "x": 1082.8782253545503, 744 | "y": -783.6076570560009, 745 | "strokeColor": "#dc372d", 746 | "backgroundColor": "#ffffff", 747 | "width": 23.95636954266704, 748 | "height": 22.98750336954037, 749 | "seed": 1970438526, 750 | "groupIds": [], 751 | "strokeSharpness": "round", 752 | "boundElementIds": [], 753 | "points": [ 754 | [ 755 | 0, 756 | 0 757 | ], 758 | [ 759 | -23.95636954266704, 760 | -22.98750336954037 761 | ] 762 | ], 763 | "lastCommittedPoint": null 764 | }, 765 | { 766 | "type": "line", 767 | "version": 1786, 768 | "versionNonce": 2101719464, 769 | "isDeleted": false, 770 | "id": "J7Hmcgj6L-W9bd_6h2JHv", 771 | "fillStyle": "solid", 772 | "strokeWidth": 2, 773 | "strokeStyle": "solid", 774 | "roughness": 2, 775 | "opacity": 100, 776 | "angle": 0, 777 | "x": 1079.692599967169, 778 | "y": -659.49653073497, 779 | "strokeColor": "#dc372d", 780 | "backgroundColor": "#ffffff", 781 | "width": 27.69726948890602, 782 | "height": 19.177398696649526, 783 | "seed": 839834978, 784 | "groupIds": [], 785 | "strokeSharpness": "round", 786 | "boundElementIds": [], 787 | "points": [ 788 | [ 789 | 0, 790 | 0 791 | ], 792 | [ 793 | -27.69726948890602, 794 | 19.177398696649526 795 | ] 796 | ], 797 | "lastCommittedPoint": null 798 | }, 799 | { 800 | "type": "line", 801 | "version": 1789, 802 | "versionNonce": 677747928, 803 | "isDeleted": false, 804 | "id": "mZXBzZEuYVmY47_veiL8B", 805 | "fillStyle": "solid", 806 | "strokeWidth": 2, 807 | "strokeStyle": "solid", 808 | "roughness": 2, 809 | "opacity": 100, 810 | "angle": 0, 811 | "x": 1103.3677648505989, 812 | "y": -636.9616303717756, 813 | "strokeColor": "#dc372d", 814 | "backgroundColor": "#ffffff", 815 | "width": 24.3023931759265, 816 | "height": 23.906388351196213, 817 | "seed": 1625399742, 818 | "groupIds": [], 819 | "strokeSharpness": "round", 820 | "boundElementIds": [], 821 | "points": [ 822 | [ 823 | 0, 824 | 0 825 | ], 826 | [ 827 | -24.3023931759265, 828 | 23.906388351196213 829 | ] 830 | ], 831 | "lastCommittedPoint": null 832 | }, 833 | { 834 | "type": "rectangle", 835 | "version": 1955, 836 | "versionNonce": 804338856, 837 | "isDeleted": false, 838 | "id": "8wU0_Wu_XLZgjsXzP8EBr", 839 | "fillStyle": "solid", 840 | "strokeWidth": 2, 841 | "strokeStyle": "solid", 842 | "roughness": 0, 843 | "opacity": 100, 844 | "angle": 0, 845 | "x": 1154.2584744257438, 846 | "y": -830.0964837801475, 847 | "strokeColor": "#ffffff", 848 | "backgroundColor": "#ffffff", 849 | "width": 12.725980289877686, 850 | "height": 7.877804717208271, 851 | "seed": 1355866402, 852 | "groupIds": [], 853 | "strokeSharpness": "sharp", 854 | "boundElementIds": [] 855 | }, 856 | { 857 | "type": "rectangle", 858 | "version": 1798, 859 | "versionNonce": 1884045784, 860 | "isDeleted": false, 861 | "id": "CYxNlMkQ2H_dp-5JhOso2", 862 | "fillStyle": "solid", 863 | "strokeWidth": 2, 864 | "strokeStyle": "solid", 865 | "roughness": 0, 866 | "opacity": 100, 867 | "angle": 0, 868 | "x": 1150.7328780735438, 869 | "y": -638.5570239428553, 870 | "strokeColor": "#ffffff", 871 | "backgroundColor": "#ffffff", 872 | "width": 18.28158195721097, 873 | "height": 18.173930160196875, 874 | "seed": 167950846, 875 | "groupIds": [], 876 | "strokeSharpness": "sharp", 877 | "boundElementIds": [] 878 | }, 879 | { 880 | "type": "rectangle", 881 | "version": 1855, 882 | "versionNonce": 989030312, 883 | "isDeleted": false, 884 | "id": "zYCJP7ZDu6-ivTJrqytj6", 885 | "fillStyle": "solid", 886 | "strokeWidth": 2, 887 | "strokeStyle": "solid", 888 | "roughness": 0, 889 | "opacity": 100, 890 | "angle": 0, 891 | "x": 1229.1952124456097, 892 | "y": -729.9242946344116, 893 | "strokeColor": "#ffffff", 894 | "backgroundColor": "#ffffff", 895 | "width": 31.42279060700006, 896 | "height": 20.561493229687567, 897 | "seed": 404516066, 898 | "groupIds": [], 899 | "strokeSharpness": "sharp", 900 | "boundElementIds": [] 901 | }, 902 | { 903 | "type": "rectangle", 904 | "version": 1814, 905 | "versionNonce": 773211864, 906 | "isDeleted": false, 907 | "id": "PVGrW2eXE65PT_g--Ano_", 908 | "fillStyle": "solid", 909 | "strokeWidth": 2, 910 | "strokeStyle": "solid", 911 | "roughness": 0, 912 | "opacity": 100, 913 | "angle": 0, 914 | "x": 1058.579095122454, 915 | "y": -744.8055028887131, 916 | "strokeColor": "#ffffff", 917 | "backgroundColor": "#ffffff", 918 | "width": 14.275397225473034, 919 | "height": 28.185547282505528, 920 | "seed": 1473694270, 921 | "groupIds": [], 922 | "strokeSharpness": "sharp", 923 | "boundElementIds": [] 924 | }, 925 | { 926 | "type": "rectangle", 927 | "version": 1861, 928 | "versionNonce": 444084904, 929 | "isDeleted": false, 930 | "id": "JnYXNxrNyyZP15YK5_O8m", 931 | "fillStyle": "solid", 932 | "strokeWidth": 2, 933 | "strokeStyle": "solid", 934 | "roughness": 0, 935 | "opacity": 100, 936 | "angle": 0.7360496257779765, 937 | "x": 1082.3076494964962, 938 | "y": -808.8675346850916, 939 | "strokeColor": "#ffffff", 940 | "backgroundColor": "#ffffff", 941 | "width": 29.07178480781002, 942 | "height": 19.703325171446156, 943 | "seed": 1300267170, 944 | "groupIds": [], 945 | "strokeSharpness": "sharp", 946 | "boundElementIds": [] 947 | }, 948 | { 949 | "type": "rectangle", 950 | "version": 1954, 951 | "versionNonce": 240626648, 952 | "isDeleted": false, 953 | "id": "wzSAiaiI5ELLVZka21Y87", 954 | "fillStyle": "solid", 955 | "strokeWidth": 2, 956 | "strokeStyle": "solid", 957 | "roughness": 0, 958 | "opacity": 100, 959 | "angle": 0.6319935541839508, 960 | "x": 1224.9510474970698, 961 | "y": -669.8564111464095, 962 | "strokeColor": "#ffffff", 963 | "backgroundColor": "#ffffff", 964 | "width": 13.902571050166724, 965 | "height": 21.345067908497217, 966 | "seed": 691982974, 967 | "groupIds": [], 968 | "strokeSharpness": "sharp", 969 | "boundElementIds": [] 970 | }, 971 | { 972 | "type": "rectangle", 973 | "version": 1992, 974 | "versionNonce": 1697357224, 975 | "isDeleted": false, 976 | "id": "o_7c7i6uyfe0GY_AY4m4_", 977 | "fillStyle": "solid", 978 | "strokeWidth": 2, 979 | "strokeStyle": "solid", 980 | "roughness": 0, 981 | "opacity": 100, 982 | "angle": 5.620151537962482, 983 | "x": 1087.480076817545, 984 | "y": -665.2198970159213, 985 | "strokeColor": "#ffffff", 986 | "backgroundColor": "#ffffff", 987 | "width": 12.321648243378045, 988 | "height": 16.877923442785182, 989 | "seed": 749476962, 990 | "groupIds": [], 991 | "strokeSharpness": "sharp", 992 | "boundElementIds": [] 993 | }, 994 | { 995 | "type": "rectangle", 996 | "version": 1926, 997 | "versionNonce": 186937560, 998 | "isDeleted": false, 999 | "id": "Tbmi-tviBw0QRG3UraTYJ", 1000 | "fillStyle": "solid", 1001 | "strokeWidth": 2, 1002 | "strokeStyle": "solid", 1003 | "roughness": 0, 1004 | "opacity": 100, 1005 | "angle": 5.441807526178588, 1006 | "x": 1228.5531115994927, 1007 | "y": -804.0957315202284, 1008 | "strokeColor": "#ffffff", 1009 | "backgroundColor": "#ffffff", 1010 | "width": 12.534708126290793, 1011 | "height": 15.415433360228649, 1012 | "seed": 1492898494, 1013 | "groupIds": [], 1014 | "strokeSharpness": "sharp", 1015 | "boundElementIds": [] 1016 | }, 1017 | { 1018 | "type": "diamond", 1019 | "version": 1189, 1020 | "versionNonce": 2084153512, 1021 | "isDeleted": false, 1022 | "id": "PS2B_NmgnbkJ9t8F5KhAQ", 1023 | "fillStyle": "cross-hatch", 1024 | "strokeWidth": 2, 1025 | "strokeStyle": "solid", 1026 | "roughness": 2, 1027 | "opacity": 100, 1028 | "angle": 0, 1029 | "x": 1356.4747117694437, 1030 | "y": -410.3641356821146, 1031 | "strokeColor": "#dc372d", 1032 | "backgroundColor": "#dc372d", 1033 | "width": 369.7688088179806, 1034 | "height": 180.58476709715336, 1035 | "seed": 594427938, 1036 | "groupIds": [], 1037 | "strokeSharpness": "sharp", 1038 | "boundElementIds": [] 1039 | }, 1040 | { 1041 | "type": "diamond", 1042 | "version": 1227, 1043 | "versionNonce": 1007719896, 1044 | "isDeleted": false, 1045 | "id": "a59Nqn8I1DbWRnopNB9ic", 1046 | "fillStyle": "cross-hatch", 1047 | "strokeWidth": 2, 1048 | "strokeStyle": "solid", 1049 | "roughness": 2, 1050 | "opacity": 100, 1051 | "angle": 0, 1052 | "x": 1358.2551971309535, 1053 | "y": -444.9619123830212, 1054 | "strokeColor": "#dc372d", 1055 | "backgroundColor": "#dc372d", 1056 | "width": 369.7688088179806, 1057 | "height": 180.58476709715336, 1058 | "seed": 1101974270, 1059 | "groupIds": [], 1060 | "strokeSharpness": "sharp", 1061 | "boundElementIds": [] 1062 | }, 1063 | { 1064 | "type": "diamond", 1065 | "version": 1222, 1066 | "versionNonce": 994988968, 1067 | "isDeleted": false, 1068 | "id": "Lb4wtlD9q8mLcYWUDt5FV", 1069 | "fillStyle": "cross-hatch", 1070 | "strokeWidth": 2, 1071 | "strokeStyle": "solid", 1072 | "roughness": 2, 1073 | "opacity": 100, 1074 | "angle": 0, 1075 | "x": 1359.373871386862, 1076 | "y": -486.01981942435384, 1077 | "strokeColor": "#dc372d", 1078 | "backgroundColor": "#dc372d", 1079 | "width": 369.7688088179806, 1080 | "height": 180.58476709715336, 1081 | "seed": 230026210, 1082 | "groupIds": [], 1083 | "strokeSharpness": "sharp", 1084 | "boundElementIds": [] 1085 | }, 1086 | { 1087 | "type": "ellipse", 1088 | "version": 1135, 1089 | "versionNonce": 640686808, 1090 | "isDeleted": false, 1091 | "id": "tbeojvE4C7iu5lJnlAe3g", 1092 | "fillStyle": "solid", 1093 | "strokeWidth": 2, 1094 | "strokeStyle": "solid", 1095 | "roughness": 2, 1096 | "opacity": 100, 1097 | "angle": 0, 1098 | "x": 1407.0704770320745, 1099 | "y": -422.040004679886, 1100 | "strokeColor": "#dc372d", 1101 | "backgroundColor": "#ffffff", 1102 | "width": 100.1220191300768, 1103 | "height": 44.39172776657513, 1104 | "seed": 1104722750, 1105 | "groupIds": [], 1106 | "strokeSharpness": "sharp", 1107 | "boundElementIds": [] 1108 | }, 1109 | { 1110 | "type": "diamond", 1111 | "version": 1209, 1112 | "versionNonce": 680894120, 1113 | "isDeleted": false, 1114 | "id": "KJQqB4V1wN3WJxz5tMfpy", 1115 | "fillStyle": "solid", 1116 | "strokeWidth": 2, 1117 | "strokeStyle": "solid", 1118 | "roughness": 2, 1119 | "opacity": 100, 1120 | "angle": 0, 1121 | "x": 1585.0097822563976, 1122 | "y": -422.77633754505416, 1123 | "strokeColor": "#dc372d", 1124 | "backgroundColor": "#ffffff", 1125 | "width": 118.65546921995968, 1126 | "height": 51.82724591481426, 1127 | "seed": 1905401762, 1128 | "groupIds": [], 1129 | "strokeSharpness": "sharp", 1130 | "boundElementIds": [] 1131 | }, 1132 | { 1133 | "type": "draw", 1134 | "version": 1416, 1135 | "versionNonce": 202833880, 1136 | "isDeleted": false, 1137 | "id": "bz2OfvpDxBHnqp7uQXzeA", 1138 | "fillStyle": "solid", 1139 | "strokeWidth": 2, 1140 | "strokeStyle": "solid", 1141 | "roughness": 2, 1142 | "opacity": 100, 1143 | "angle": 0, 1144 | "x": 1486.7822710142823, 1145 | "y": -359.09846244490257, 1146 | "strokeColor": "#dc372d", 1147 | "backgroundColor": "#ffffff", 1148 | "width": 96.10422361372581, 1149 | "height": 56.07216720667933, 1150 | "seed": 1071293310, 1151 | "groupIds": [], 1152 | "strokeSharpness": "round", 1153 | "boundElementIds": [], 1154 | "points": [ 1155 | [ 1156 | 0, 1157 | 7.370337226511832 1158 | ], 1159 | [ 1160 | 62.388842045462205, 1161 | 41.31397052966609 1162 | ], 1163 | [ 1164 | 74.95024795622176, 1165 | 42.36513595667933 1166 | ], 1167 | [ 1168 | 96.10422361372581, 1169 | -13.70703125 1170 | ], 1171 | [ 1172 | 0.7969233649414038, 1173 | 5.922732267024985 1174 | ], 1175 | [ 1176 | 0, 1177 | 7.370337226511832 1178 | ] 1179 | ], 1180 | "lastCommittedPoint": null 1181 | }, 1182 | { 1183 | "type": "draw", 1184 | "version": 1801, 1185 | "versionNonce": 1413676456, 1186 | "isDeleted": false, 1187 | "id": "e_-Pvk_-59yNPqsDhyan4", 1188 | "fillStyle": "solid", 1189 | "strokeWidth": 2, 1190 | "strokeStyle": "solid", 1191 | "roughness": 2, 1192 | "opacity": 100, 1193 | "angle": 0.3652997825890516, 1194 | "x": 1523.5622146089136, 1195 | "y": -461.10459931349595, 1196 | "strokeColor": "#dc372d", 1197 | "backgroundColor": "#ffffff", 1198 | "width": 82.66349789640633, 1199 | "height": 77.05859530075612, 1200 | "seed": 993123170, 1201 | "groupIds": [], 1202 | "strokeSharpness": "round", 1203 | "boundElementIds": [], 1204 | "points": [ 1205 | [ 1206 | 0, 1207 | 0 1208 | ], 1209 | [ 1210 | 26.25920742500113, 1211 | 17.13883596935795 1212 | ], 1213 | [ 1214 | 47.851782652133124, 1215 | -1.9985694686105353 1216 | ], 1217 | [ 1218 | 53.030562512546574, 1219 | -3.3422596376593967 1220 | ], 1221 | [ 1222 | 53.030562512546574, 1223 | 17.68513424515812 1224 | ], 1225 | [ 1226 | 49.302270787311144, 1227 | 26.61592344954338 1228 | ], 1229 | [ 1230 | 76.06646297048542, 1231 | 48.46446132455747 1232 | ], 1233 | [ 1234 | 39.191831267292294, 1235 | 38.91272439053595 1236 | ], 1237 | [ 1238 | 38.77873202632827, 1239 | 47.84745958931194 1240 | ], 1241 | [ 1242 | 38.676102152562336, 1243 | 73.71633566309673 1244 | ], 1245 | [ 1246 | 23.662654590423116, 1247 | 40.263200873569964 1248 | ], 1249 | [ 1250 | 3.037071453409844, 1251 | 49.16684482201491 1252 | ], 1253 | [ 1254 | -6.597034925920909, 1255 | 48.091214055377364 1256 | ], 1257 | [ 1258 | 13.319420678338677, 1259 | 27.986758874532644 1260 | ], 1261 | [ 1262 | 13.126022260314933, 1263 | 24.702182905746636 1264 | ], 1265 | [ 1266 | 0, 1267 | 0 1268 | ] 1269 | ], 1270 | "lastCommittedPoint": null 1271 | }, 1272 | { 1273 | "type": "text", 1274 | "version": 369, 1275 | "versionNonce": 1037649112, 1276 | "isDeleted": false, 1277 | "id": "ce3nZF0cv42rLpeMOQWS0", 1278 | "fillStyle": "hachure", 1279 | "strokeWidth": 2, 1280 | "strokeStyle": "solid", 1281 | "roughness": 2, 1282 | "opacity": 100, 1283 | "angle": 0, 1284 | "x": 1200.8571428571436, 1285 | "y": -1027.0380952380951, 1286 | "strokeColor": "#000000", 1287 | "backgroundColor": "#ced4da", 1288 | "width": 599, 1289 | "height": 119.80000000000001, 1290 | "seed": 1477773973, 1291 | "groupIds": [], 1292 | "strokeSharpness": "sharp", 1293 | "boundElementIds": [], 1294 | "fontSize": 95.84000000000009, 1295 | "fontFamily": 1, 1296 | "text": "Pop-up store", 1297 | "baseline": 83.80000000000001, 1298 | "textAlign": "left", 1299 | "verticalAlign": "top" 1300 | }, 1301 | { 1302 | "type": "diamond", 1303 | "version": 356, 1304 | "versionNonce": 451679400, 1305 | "isDeleted": false, 1306 | "id": "48EtF-kTeMnuiAUzXl46t", 1307 | "fillStyle": "hachure", 1308 | "strokeWidth": 2, 1309 | "strokeStyle": "solid", 1310 | "roughness": 2, 1311 | "opacity": 100, 1312 | "angle": 0, 1313 | "x": 447.3333333333335, 1314 | "y": -511.0757575757576, 1315 | "strokeColor": "#000000", 1316 | "backgroundColor": "#15aabf", 1317 | "width": 375.0000000000004, 1318 | "height": 278.4090909090913, 1319 | "seed": 1868530613, 1320 | "groupIds": [], 1321 | "strokeSharpness": "sharp", 1322 | "boundElementIds": [] 1323 | }, 1324 | { 1325 | "type": "text", 1326 | "version": 531, 1327 | "versionNonce": 1762322904, 1328 | "isDeleted": false, 1329 | "id": "ODlUrfxkSQw10zkeazwKr", 1330 | "fillStyle": "hachure", 1331 | "strokeWidth": 2, 1332 | "strokeStyle": "solid", 1333 | "roughness": 2, 1334 | "opacity": 100, 1335 | "angle": 0, 1336 | "x": 501.7651515151505, 1337 | "y": -406.6724081192339, 1338 | "strokeColor": "#000000", 1339 | "backgroundColor": "#ced4da", 1340 | "width": 278.78787878787864, 1341 | "height": 66.66666666666663, 1342 | "seed": 2141342581, 1343 | "groupIds": [], 1344 | "strokeSharpness": "sharp", 1345 | "boundElementIds": [], 1346 | "fontSize": 52.80929069645175, 1347 | "fontFamily": 1, 1348 | "text": "Customers", 1349 | "baseline": 46.66666666666663, 1350 | "textAlign": "center", 1351 | "verticalAlign": "top" 1352 | }, 1353 | { 1354 | "type": "arrow", 1355 | "version": 545, 1356 | "versionNonce": 819150760, 1357 | "isDeleted": false, 1358 | "id": "LTJlrZBKsjVUPx9djnipm", 1359 | "fillStyle": "hachure", 1360 | "strokeWidth": 2, 1361 | "strokeStyle": "solid", 1362 | "roughness": 2, 1363 | "opacity": 100, 1364 | "angle": 0, 1365 | "x": 853.4166666666687, 1366 | "y": -377.91666666666595, 1367 | "strokeColor": "#000000", 1368 | "backgroundColor": "#ced4da", 1369 | "width": 440.7649358341383, 1370 | "height": 5.642133385563852, 1371 | "seed": 2091832245, 1372 | "groupIds": [], 1373 | "strokeSharpness": "round", 1374 | "boundElementIds": [], 1375 | "points": [ 1376 | [ 1377 | 0, 1378 | 0 1379 | ], 1380 | [ 1381 | 440.7649358341383, 1382 | 5.642133385563852 1383 | ] 1384 | ], 1385 | "lastCommittedPoint": null 1386 | }, 1387 | { 1388 | "type": "arrow", 1389 | "version": 1178, 1390 | "versionNonce": 1757408984, 1391 | "isDeleted": false, 1392 | "id": "n_ZvfkrG8bMDRq9bDEbC0", 1393 | "fillStyle": "hachure", 1394 | "strokeWidth": 2, 1395 | "strokeStyle": "solid", 1396 | "roughness": 2, 1397 | "opacity": 100, 1398 | "angle": 0, 1399 | "x": 1294.8511265488194, 1400 | "y": -598.4941280515413, 1401 | "strokeColor": "#000000", 1402 | "backgroundColor": "#ced4da", 1403 | "width": 154.0899892613602, 1404 | "height": 124.00087078322088, 1405 | "seed": 1319875003, 1406 | "groupIds": [], 1407 | "strokeSharpness": "round", 1408 | "boundElementIds": [], 1409 | "points": [ 1410 | [ 1411 | 0, 1412 | 0 1413 | ], 1414 | [ 1415 | 154.0899892613602, 1416 | 124.00087078322088 1417 | ] 1418 | ], 1419 | "lastCommittedPoint": null 1420 | }, 1421 | { 1422 | "type": "arrow", 1423 | "version": 834, 1424 | "versionNonce": 1990003368, 1425 | "isDeleted": false, 1426 | "id": "2-jIa_4ZOktAJxPRHMEIz", 1427 | "fillStyle": "hachure", 1428 | "strokeWidth": 2, 1429 | "strokeStyle": "solid", 1430 | "roughness": 2, 1431 | "opacity": 100, 1432 | "angle": 0, 1433 | "x": 1319.0502948319747, 1434 | "y": -734.8069129870784, 1435 | "strokeColor": "#000000", 1436 | "backgroundColor": "transparent", 1437 | "width": 319.30107307398293, 1438 | "height": 38.453641405534086, 1439 | "seed": 473089275, 1440 | "groupIds": [], 1441 | "strokeSharpness": "round", 1442 | "boundElementIds": [], 1443 | "points": [ 1444 | [ 1445 | 0, 1446 | 0 1447 | ], 1448 | [ 1449 | 319.30107307398293, 1450 | 38.453641405534086 1451 | ] 1452 | ], 1453 | "lastCommittedPoint": null 1454 | }, 1455 | { 1456 | "type": "arrow", 1457 | "version": 1307, 1458 | "versionNonce": 361518040, 1459 | "isDeleted": false, 1460 | "id": "ONsQAvuPvu5vfh9-xLrz5", 1461 | "fillStyle": "hachure", 1462 | "strokeWidth": 2, 1463 | "strokeStyle": "solid", 1464 | "roughness": 2, 1465 | "opacity": 100, 1466 | "angle": 0, 1467 | "x": 2213.608391549644, 1468 | "y": -597.3427287203305, 1469 | "strokeColor": "#000000", 1470 | "backgroundColor": "transparent", 1471 | "width": 268.8707056575761, 1472 | "height": 78.9958195400659, 1473 | "seed": 1487710133, 1474 | "groupIds": [], 1475 | "strokeSharpness": "round", 1476 | "boundElementIds": [], 1477 | "points": [ 1478 | [ 1479 | 0, 1480 | 0 1481 | ], 1482 | [ 1483 | -268.8707056575761, 1484 | -78.9958195400659 1485 | ] 1486 | ], 1487 | "lastCommittedPoint": null 1488 | }, 1489 | { 1490 | "type": "line", 1491 | "version": 5689, 1492 | "versionNonce": 1607714008, 1493 | "isDeleted": false, 1494 | "id": "uVBOH3cl0_QdDvWgcUH-O", 1495 | "fillStyle": "hachure", 1496 | "strokeWidth": 1, 1497 | "strokeStyle": "solid", 1498 | "roughness": 2, 1499 | "opacity": 100, 1500 | "angle": 0, 1501 | "x": 2576.3900380364557, 1502 | "y": -700.8559430368493, 1503 | "strokeColor": "#000000", 1504 | "backgroundColor": "#fd7e14", 1505 | "width": 396.4224535249566, 1506 | "height": 376.38063822734034, 1507 | "seed": 672131541, 1508 | "groupIds": [], 1509 | "strokeSharpness": "round", 1510 | "boundElementIds": [], 1511 | "points": [ 1512 | [ 1513 | 0, 1514 | 0 1515 | ], 1516 | [ 1517 | -7.40111931901879, 1518 | -21.631071162490798 1519 | ], 1520 | [ 1521 | -26.829057531443823, 1522 | -42.39689947848191 1523 | ], 1524 | [ 1525 | -51.807835233133915, 1526 | -56.24078502247605 1527 | ], 1528 | [ 1529 | -64.75979404141685, 1530 | -93.87884884520972 1531 | ], 1532 | [ 1533 | -105.0033803385844, 1534 | -66.19107775722242 1535 | ], 1536 | [ 1537 | -157.27378552915752, 1538 | -62.73010637122323 1539 | ], 1540 | [ 1541 | -212.78218042180072, 1542 | -98.2050630777089 1543 | ], 1544 | [ 1545 | -245.16207744250903, 1546 | -46.723113710980016 1547 | ], 1548 | [ 1549 | -267.3654353995678, 1550 | -14.70912839049393 1551 | ], 1552 | [ 1553 | -347.39003803645505, 1554 | 2.163107116248966 1555 | ], 1556 | [ 1557 | -269.6782851867589, 1558 | 48.45359940397941 1559 | ], 1560 | [ 1561 | -261.8145959103001, 1562 | 91.71574172896115 1563 | ], 1564 | [ 1565 | -321.9486903773279, 1566 | 157.4741980629328 1567 | ], 1568 | [ 1569 | -232.67268859166427, 1570 | 185.16196915092127 1571 | ], 1572 | [ 1573 | -181.32742331596944, 1574 | 218.04119731790718 1575 | ], 1576 | [ 1577 | -154.4983657845246, 1578 | 278.1755751496314 1579 | ], 1580 | [ 1581 | -96.67712110468631, 1582 | 221.93479012715565 1583 | ], 1584 | [ 1585 | -43.94414595667672, 1586 | 212.84974023890945 1587 | ], 1588 | [ 1589 | 16.18994851035461, 1590 | 217.60857589465724 1591 | ], 1592 | [ 1593 | 0.46256995743817697, 1594 | 168.28973364417845 1595 | ], 1596 | [ 1597 | 6.475979404142322, 1598 | 117.67302712394974 1599 | ], 1600 | [ 1601 | 49.032415488501556, 1602 | 92.14836315221075 1603 | ], 1604 | [ 1605 | -8.7888291913373, 1606 | 64.4605920642226 1607 | ], 1608 | [ 1609 | -26.829057531443823, 1610 | 43.69476374823154 1611 | ], 1612 | [ 1613 | -55.97096485008228, 1614 | 24.226799701989563 1615 | ], 1616 | [ 1617 | -92.97656144517816, 1618 | 15.141749813743616 1619 | ], 1620 | [ 1621 | -142.47154689111926, 1622 | 16.872235506742868 1623 | ], 1624 | [ 1625 | -183.17770314572385, 1626 | 43.26214232498177 1627 | ], 1628 | [ 1629 | -200.29279157095516, 1630 | 82.63069184071495 1631 | ], 1632 | [ 1633 | -186.41569284779507, 1634 | 123.7297270494473 1635 | ], 1636 | [ 1637 | -138.30841727417248, 1638 | 139.30409828644085 1639 | ], 1640 | [ 1641 | -86.50058204103618, 1642 | 135.84312690044217 1643 | ], 1644 | [ 1645 | -67.53521378605103, 1646 | 125.46021274244647 1647 | ], 1648 | [ 1649 | -68.46035370092784, 1650 | 117.2404057007002 1651 | ], 1652 | [ 1653 | -86.03801208359664, 1654 | 126.75807701219618 1655 | ], 1656 | [ 1657 | -138.30841727417248, 1658 | 125.8928341656963 1659 | ], 1660 | [ 1661 | -167.16719426688906, 1662 | 103.52152439245594 1663 | ], 1664 | [ 1665 | -157.152473030309, 1666 | 64.451769115724 1667 | ], 1668 | [ 1669 | -117.95533914686689, 1670 | 43.26214232498177 1671 | ], 1672 | [ 1673 | -54.583254977766046, 1674 | 62.297484947973686 1675 | ], 1676 | [ 1677 | -32.57216335468229, 1678 | 103.4931913727064 1679 | ], 1680 | [ 1681 | -55.42653871204402, 1682 | 162.30920982943076 1683 | ], 1684 | [ 1685 | -144.32182672087242, 1686 | 183.86410488117195 1687 | ], 1688 | [ 1689 | -227.02464455830477, 1690 | 142.8530238336865 1691 | ], 1692 | [ 1693 | -226.36607708629526, 1694 | 50.175283327229295 1695 | ], 1696 | [ 1697 | -186.08335549005005, 1698 | -11.044127449742405 1699 | ], 1700 | [ 1701 | -82.80002238152713, 1702 | -34.609713859985476 1703 | ], 1704 | [ 1705 | 0, 1706 | 0 1707 | ] 1708 | ], 1709 | "lastCommittedPoint": null 1710 | }, 1711 | { 1712 | "type": "text", 1713 | "version": 381, 1714 | "versionNonce": 1093888728, 1715 | "isDeleted": false, 1716 | "id": "_p-6W8x6zCJ7cwS7eV7Jy", 1717 | "fillStyle": "hachure", 1718 | "strokeWidth": 2, 1719 | "strokeStyle": "solid", 1720 | "roughness": 2, 1721 | "opacity": 100, 1722 | "angle": 0, 1723 | "x": 2277.823757471412, 1724 | "y": -407.63316892963627, 1725 | "strokeColor": "#000000", 1726 | "backgroundColor": "#fd7e14", 1727 | "width": 356.2784905065945, 1728 | "height": 104.787791325469, 1729 | "seed": 826342075, 1730 | "groupIds": [], 1731 | "strokeSharpness": "sharp", 1732 | "boundElementIds": [], 1733 | "fontSize": 83.83023306037522, 1734 | "fontFamily": 1, 1735 | "text": "Grafana", 1736 | "baseline": 73.787791325469, 1737 | "textAlign": "left", 1738 | "verticalAlign": "top" 1739 | }, 1740 | { 1741 | "type": "arrow", 1742 | "version": 1330, 1743 | "versionNonce": 117997736, 1744 | "isDeleted": false, 1745 | "id": "bJGYHavolHmmsug6V3sRe", 1746 | "fillStyle": "hachure", 1747 | "strokeWidth": 2, 1748 | "strokeStyle": "solid", 1749 | "roughness": 2, 1750 | "opacity": 100, 1751 | "angle": 0, 1752 | "x": 2209.7469551490867, 1753 | "y": -484.92894405310744, 1754 | "strokeColor": "#000000", 1755 | "backgroundColor": "transparent", 1756 | "width": 425.67047577589733, 1757 | "height": 127.93772116103042, 1758 | "seed": 505204347, 1759 | "groupIds": [], 1760 | "strokeSharpness": "round", 1761 | "boundElementIds": [], 1762 | "points": [ 1763 | [ 1764 | 0, 1765 | 0 1766 | ], 1767 | [ 1768 | -425.67047577589733, 1769 | 127.93772116103042 1770 | ] 1771 | ], 1772 | "lastCommittedPoint": null 1773 | }, 1774 | { 1775 | "type": "text", 1776 | "version": 280, 1777 | "versionNonce": 742079960, 1778 | "isDeleted": false, 1779 | "id": "yJSRRiNbv2Uhm_PthHLRT", 1780 | "fillStyle": "hachure", 1781 | "strokeWidth": 2, 1782 | "strokeStyle": "solid", 1783 | "roughness": 2, 1784 | "opacity": 100, 1785 | "angle": 0, 1786 | "x": 1048.7779947916665, 1787 | "y": -577.3375651041664, 1788 | "strokeColor": "#000000", 1789 | "backgroundColor": "#ced4da", 1790 | "width": 238.93333333333345, 1791 | "height": 53.33333333333332, 1792 | "seed": 221544411, 1793 | "groupIds": [], 1794 | "strokeSharpness": "sharp", 1795 | "boundElementIds": [], 1796 | "fontSize": 42.66666666666669, 1797 | "fontFamily": 1, 1798 | "text": "RedisGears", 1799 | "baseline": 37.33333333333332, 1800 | "textAlign": "left", 1801 | "verticalAlign": "top" 1802 | }, 1803 | { 1804 | "type": "arrow", 1805 | "version": 1295, 1806 | "versionNonce": 914500520, 1807 | "isDeleted": false, 1808 | "id": "-qXnoatmi41Qbxxb273YN", 1809 | "fillStyle": "hachure", 1810 | "strokeWidth": 2, 1811 | "strokeStyle": "solid", 1812 | "roughness": 2, 1813 | "opacity": 100, 1814 | "angle": 0, 1815 | "x": 1477.195467347462, 1816 | "y": -500.7869551435813, 1817 | "strokeColor": "#000000", 1818 | "backgroundColor": "#ced4da", 1819 | "width": 150.48010811594008, 1820 | "height": 117.08962887774783, 1821 | "seed": 1824574843, 1822 | "groupIds": [], 1823 | "strokeSharpness": "round", 1824 | "boundElementIds": [], 1825 | "points": [ 1826 | [ 1827 | 0, 1828 | 0 1829 | ], 1830 | [ 1831 | -150.48010811594008, 1832 | -117.08962887774783 1833 | ] 1834 | ], 1835 | "lastCommittedPoint": null 1836 | }, 1837 | { 1838 | "type": "text", 1839 | "version": 237, 1840 | "versionNonce": 180732632, 1841 | "isDeleted": false, 1842 | "id": "0_VVhibDZarTTophtHbso", 1843 | "fillStyle": "hachure", 1844 | "strokeWidth": 2, 1845 | "strokeStyle": "solid", 1846 | "roughness": 2, 1847 | "opacity": 100, 1848 | "angle": 0, 1849 | "x": 519.6666666666664, 1850 | "y": -214.41666666666637, 1851 | "strokeColor": "#000000", 1852 | "backgroundColor": "#ced4da", 1853 | "width": 221.99999999999991, 1854 | "height": 77.08333333333316, 1855 | "seed": 1952931067, 1856 | "groupIds": [], 1857 | "strokeSharpness": "sharp", 1858 | "boundElementIds": [], 1859 | "fontSize": 61.66666666666658, 1860 | "fontFamily": 1, 1861 | "text": "Node.js", 1862 | "baseline": 54.08333333333316, 1863 | "textAlign": "left", 1864 | "verticalAlign": "top" 1865 | }, 1866 | { 1867 | "type": "text", 1868 | "version": 410, 1869 | "versionNonce": 1066301096, 1870 | "isDeleted": false, 1871 | "id": "opJK194qGl3IWRUNIv84Y", 1872 | "fillStyle": "hachure", 1873 | "strokeWidth": 2, 1874 | "strokeStyle": "solid", 1875 | "roughness": 2, 1876 | "opacity": 100, 1877 | "angle": 0, 1878 | "x": 1696.666666666667, 1879 | "y": -604.5198808834879, 1880 | "strokeColor": "#000000", 1881 | "backgroundColor": "#ced4da", 1882 | "width": 229.76588541666717, 1883 | "height": 53.18654755015443, 1884 | "seed": 1225151445, 1885 | "groupIds": [], 1886 | "strokeSharpness": "sharp", 1887 | "boundElementIds": [ 1888 | "-maJWYqX4w-3xneaGuO09", 1889 | "jRSy3RKldVzZsVqqnsZTa" 1890 | ], 1891 | "fontSize": 42.54923804012357, 1892 | "fontFamily": 1, 1893 | "text": "TimeSeries", 1894 | "baseline": 37.18654755015443, 1895 | "textAlign": "left", 1896 | "verticalAlign": "top" 1897 | } 1898 | ], 1899 | "appState": { 1900 | "viewBackgroundColor": "#ffffff", 1901 | "gridSize": null 1902 | } 1903 | } --------------------------------------------------------------------------------