├── .gitignore ├── HOWTO.md ├── LICENSE ├── README.md ├── Standalone ├── docker-compose.yml ├── grafana │ ├── dashboards │ │ └── Line Overview.json │ ├── grafana.ini │ ├── plugins │ │ ├── fifemon-graphql-datasource │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── MANIFEST.txt │ │ │ ├── README.md │ │ │ ├── img │ │ │ │ ├── README │ │ │ │ ├── db_arrivals.png │ │ │ │ ├── db_arrivals_annotations.png │ │ │ │ ├── github_security_advisories.png │ │ │ │ └── logo.svg │ │ │ ├── index.html │ │ │ ├── module.js │ │ │ ├── module.js.map │ │ │ ├── partials │ │ │ │ └── annotations.editor.html │ │ │ └── plugin.json │ │ ├── isaozler-paretochart-panel │ │ │ ├── LICENSE │ │ │ ├── MANIFEST.txt │ │ │ ├── README.md │ │ │ ├── img │ │ │ │ ├── logo.svg │ │ │ │ ├── pareto-chart-edit-panel.jpg │ │ │ │ └── production-env--impression.jpg │ │ │ ├── index.html │ │ │ ├── module.js │ │ │ ├── module.js.LICENSE.txt │ │ │ ├── module.js.map │ │ │ └── plugin.json │ │ ├── libre-event-editor-panel │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── img │ │ │ │ └── logo.svg │ │ │ ├── module.js │ │ │ ├── module.js.LICENSE.txt │ │ │ ├── module.js.map │ │ │ └── plugin.json │ │ ├── marcusolsson-gantt-panel │ │ │ ├── CHANGELOG.md │ │ │ ├── LICENSE │ │ │ ├── MANIFEST.txt │ │ │ ├── README.md │ │ │ ├── img │ │ │ │ ├── dark.png │ │ │ │ ├── light.png │ │ │ │ └── logo.svg │ │ │ ├── module.js │ │ │ ├── module.js.map │ │ │ └── plugin.json │ │ └── michaeldmoore-multistat-panel │ │ │ ├── CHANGELOG.md │ │ │ ├── MANIFEST.txt │ │ │ ├── README.md │ │ │ ├── barlinks.html │ │ │ ├── columns.html │ │ │ ├── css │ │ │ └── multistat-panel.css │ │ │ ├── grouping.html │ │ │ ├── img │ │ │ ├── Showcase.gif │ │ │ └── michaeldmoore-multistat-panel.svg │ │ │ ├── layout.html │ │ │ ├── linesandlimits.html │ │ │ ├── module.html │ │ │ ├── module.js │ │ │ ├── module.js.map │ │ │ ├── options.html │ │ │ └── plugin.json │ └── provisioning │ │ ├── dashboards │ │ └── dashboards.yaml │ │ └── datasources │ │ └── datasources.yaml ├── graphql-pubsub │ └── config │ │ └── config.json ├── libre-core │ └── config │ │ └── config.json ├── libre-edge-agent │ └── config │ │ └── config.json ├── libre-gateway │ ├── supergraph.graphql │ └── supergraph.yaml ├── libre-workflow-pubsub │ └── config │ │ └── config.json └── schema │ ├── g01.rdf.gz │ └── libreSchema.sdl └── docs └── LibreArchitecture.png /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea 3 | Standalone/alpha/data/* 4 | Standalone/zero/data/* 5 | Standalone/influxdb/data/* 6 | Standalone/ACCESS_KEYS.txt 7 | 8 | 9 | -------------------------------------------------------------------------------- /HOWTO.md: -------------------------------------------------------------------------------- 1 | # Libre Core - System Demo 2 | A brief walkthrough of the various components of Libre core 3 | 4 | ## NOT FOR PRODUCTION ENVIRONMENTS. 5 | The software contained in this project, and the images pulled by the docker-compose file contained in this repo are pre-release versions and are not intended for production environments. Use of this software is at your own risk. 6 | 7 | If you would like to use Libre in a production environment, please get in touch with Libre Technologies to ensure you have the correct stable versions of services for you specific needs. 8 | 9 | ## Libre Admin 10 | Found at http://localhost 11 | 12 | Libre admin is the primary component of Libre core, it is the centrepoint of all user driven activity. 13 | 14 | Every time you login you should be greeted with an empty screen 15 | 16 | ![image](https://user-images.githubusercontent.com/54924665/134123473-e5596b30-4844-493f-850a-39c4b5c5ccab.png) 17 | 18 | ### Configuring the Menu 19 | 20 | You can access the menu by clicking the top left hand corner of the screen, and configure it through Security -> Menu Config 21 | ![image](https://user-images.githubusercontent.com/54924665/134130952-0ec4c3a9-2236-4d78-803c-c775123f2412.png) 22 | 23 | You can add new pages by clicking the + next to Menu Configuration Panel 24 | 25 | ![image](https://user-images.githubusercontent.com/54924665/134133992-72934de6-6796-4e15-a59a-6077897d6d4d.png) 26 | 27 | If you click the checkbox Is Page, the drop down menu Menu Page will appear where you can select the type of page to add 28 | 29 | ![image](https://user-images.githubusercontent.com/54924665/134267117-a2f97532-b74e-4f1f-8dde-c469200908b5.png) 30 | 31 | From the menu configuration panel, you can also drag and drop pages or sections around 32 | 33 | ### Setting up a Unit of Measure 34 | 35 | Navigate to Configuration -> Units of Measure 36 | 37 | To create a unit of measure, click the + next to the search bar 38 | 39 | ![image](https://user-images.githubusercontent.com/54924665/134277416-f8463130-ae81-477b-85c7-08db54bcaf9f.png) 40 | 41 | Set up some variables of your choice and press save 42 | 43 | ![image](https://user-images.githubusercontent.com/54924665/134277468-bedd99aa-422e-4b1f-9d76-717bf59e4054.png) 44 | 45 | 46 | ### Setting up an Equipment Class 47 | 48 | Navigate to Configuration -> Equipment Classes 49 | 50 | You should be able to see some preconfigured examples, and you can create a new one by clicking the + 51 | 52 | ![image](https://user-images.githubusercontent.com/54924665/134268966-85c331d8-f0d9-4755-80b2-40680b8d13fe.png) 53 | 54 | You can configure the various aspects of the equipment class through the top toolbar 55 | 56 | ![image](https://user-images.githubusercontent.com/54924665/134269843-ceb69289-51a9-4e13-b975-72f581a77dde.png) 57 | 58 | In the general tab you can edit the name an description of the class 59 | 60 | In the properties tab you can set up properties for the class. Click the + next to the search bar to start writing a new property and press save when you're done 61 | 62 | ![image](https://user-images.githubusercontent.com/54924665/134270460-b777f581-07ba-4742-8259-0bf59b3b3ec6.png) 63 | 64 | In the events tab, you set up triggers for Libre to record various states of the equipment. 65 | 66 | ![image](https://user-images.githubusercontent.com/54924665/134272075-28ca16f2-0b88-4acb-b1d0-0d5fadc9da27.png) 67 | 68 | Breaking down this image we have a few different fields 69 | 1. Event Name - the name of the event being established 70 | 2. Message Class - specifies the type of event. Here we use PerformanceLog as it is a measurement of the run rate of the machine 71 | 3. Trigger Property - the property that causes the data to be written 72 | 4. Trigger expression - the trigger that causes the data to be written. 73 | * The example provided here means that the edge will be monitoring the Rate property of any connected equipment, and when the Rate > 1, will trigger the expression 74 | 5. Field properties - configures the fields that get written to the database 75 | * This can be properties and/or user defined fields 76 | 77 | In the reasons tab you can add downtime reasons similarly to how you would add properties. Once you add a reason, whenever you add another reason you can assign it as a parent reason as follows 78 | ![image](https://user-images.githubusercontent.com/54924665/134272914-645fbfb7-3cbd-4272-b658-8f8886f8fbd7.png) 79 | 80 | Here, the reason we are creating would have Lunch as its parent. 81 | 82 | ### Setting up an Equipment 83 | 84 | Navigate to Configuration -> Equipment 85 | 86 | You can add an equipment similarly to the menu config or equipment classes page 87 | 88 | ![image](https://user-images.githubusercontent.com/54924665/134277593-3debc2d6-ac66-4872-9e0a-bf01ddfdd8cc.png) 89 | 90 | Set up all the variables for the equipment and click add 91 | 92 | ![image](https://user-images.githubusercontent.com/54924665/134277730-464ac927-d8d0-4ef5-9f3e-10e15df96f94.png) 93 | 94 | An equipment will inherit all properties and reasons from its equipment class, and you can create new ones specifically for that equipment simiarly to how you would do it in equipment classes 95 | 96 | 97 | 98 | ## Grafana 99 | Found at http://localhost:3000 100 | 101 | A sample grafana dashboard to visualise some sample data in the influx database 102 | 103 | ## GraphQL Playground 104 | Found at http://localhost:4000/graphql 105 | 106 | Here is a graphql endpoint that allows you to talk directly with the primary database and see the structure of the schema. Note that this will be disabled in a production environment. 107 | 108 | ## Influx 109 | Found at http://localhost:8086 110 | 111 | Here is an endpoint that allows you to directly interact with the influx database where the events described in the equipment class are stored. 112 | 113 | ## EMQX Broker 114 | Found at http://localhost:18083 115 | 116 | Enables you track all the MQTT connections in the service 117 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | “Commons Clause” License Condition v1.0 2 | 3 | The Software is provided to you by the Licensor under the License, as defined below, 4 | subject to the following condition. 5 | 6 | Without limiting other conditions in the License, the grant of rights under the License 7 | will not include, and the License does not grant to you, the right to Sell the Software. 8 | 9 | For purposes of the foregoing, “Sell” means practicing any or all of the rights granted 10 | to you under the License to provide to third parties, for a fee or other consideration 11 | (including without limitation fees for hosting or consulting/ support services related 12 | to the Software), a product or service whose value derives, entirely or substantially, 13 | from the functionality of the Software. Any license notice or attribution required by the 14 | License must also include this Commons Clause License Condition notice. 15 | 16 | Software: 17 | https://github.com/libremfg/getting-started 18 | ghcr.io/spruik/libre-gateway 19 | ghcr.io/spruik/libre-admin-ui 20 | ghcr.io/spruik/graphql-pubsub 21 | ghcr.io/spruik/libre-server 22 | ghcr.io/spruik/libre-core 23 | ghcr.io/spruik/libre-workflow-pubsub 24 | 25 | 26 | 27 | License: Apache 2 http://www.apache.org/licenses/LICENSE-2.0 28 | 29 | Licensor: Libre Technologies 30 | 31 | Copyright 2021 Libre Technologies 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Libre Core - Getting Started 2 | Instructions and docker-compose for getting started 3 | 4 | ## NOT FOR PRODUCTION ENVIRONMENTS. 5 | The software contained in this project, and the images pulled by the docker-compose file contained in this repo are pre-release versions and are not intended for production environments. Use of this software is at your own risk. 6 | 7 | If you would like to use Libre in a production environment, please get in touch with Libre Technologies to ensure you have the correct stable versions of services for you specific needs. 8 | 9 | ## What does the docker-compose include? 10 | ![image](docs/LibreArchitecture.png) 11 | #### Databases 12 | * Dgraph - The store for all non-time-series data in the Libre platform. Dgraph is a schema driven, GraphQL native, open-source database. 13 | * Influxdb - The leading open-source time-series database 14 | #### MQTT Broker 15 | * EMQX - The MQTT Broker used in the platform. We use EMQX because it has great support for clustered, highly available deployments in kubernetes 16 | #### Dashboard Tool 17 | * Grafana v8 18 | #### Simulator 19 | * Spruik PackML Simulator - Simulates a production line that produces PackML compliant data sets 20 | #### Libre Platform 21 | * Libre Administration UI 22 | * libre-core microservice 23 | * libre-server microservice 24 | * graphql-pubsub microservice 25 | * libre-workflow-pubsub microservice 26 | * libre-gateway 27 | 28 | ## INSTALLATION ## 29 | 1. Download this repository 30 | ![image](https://user-images.githubusercontent.com/54924665/133958186-de997f1e-a50a-4c7e-a066-317bfa85110f.png) 31 | * If you download the ZIP, make sure to unzip it and move it to your preferred location 32 | 2. Install docker 33 | * Windows: 34 | * https://docs.docker.com/desktop/windows/install/ 35 | * https://docs.microsoft.com/en-gb/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package (steps 1-5) 36 | * Mac: https://docs.docker.com/desktop/mac/install/ 37 | * Linux: https://docs.docker.com/engine/install/ 38 | 3. Run docker service 39 | * Navigate to your local installation on a terminal 40 | * Navigate to getting-started/standalone 41 | * Run the command: docker compose up 42 | 4. Create an account for the demo 43 | * Go to http://localhost 44 | * Create an account via auth0 45 | * Email support@libremfg.com to get your account authorised 46 | -------------------------------------------------------------------------------- /Standalone/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # This Docker Compose file can be used to quickly bootup Dgraph Zero 2 | # and Alpha in different Docker containers. 3 | 4 | # It mounts /tmp/data on the host machine to /dgraph within the 5 | # container. You can change /tmp/data to a more appropriate location. 6 | # Run `docker-compose up` to start Dgraph. 7 | 8 | version: "3.2" 9 | services: 10 | zero: 11 | image: dgraph/dgraph:v21.03.1 12 | # volumes: 13 | # - ./zero/data:/dgraph 14 | ports: 15 | - 5080:5080 16 | - 6080:6080 17 | restart: on-failure 18 | command: dgraph zero --my=zero:5080 19 | container_name: zero 20 | alpha: 21 | image: dgraph/dgraph:v21.03.1 22 | # volumes: 23 | # - ./alpha/data:/dgraph 24 | ports: 25 | - 8080:8080 26 | - 9080:9080 27 | # env_file: 28 | # - ACCESS_KEYS.txt 29 | restart: on-failure 30 | command: dgraph alpha --my=alpha:7080 --zero=zero:5080 --security whitelist=0.0.0.0/0 31 | container_name: alpha 32 | healthcheck: 33 | interval: 5s 34 | timeout: 3s 35 | retries: 5 36 | test: ["CMD", "curl", "-f", "http://alpha:8080/admin"] 37 | ratel: 38 | image: dgraph/dgraph:v20.11.3 39 | ports: 40 | - 8000:8000 41 | command: dgraph-ratel 42 | libre-ui: 43 | image: ghcr.io/spruik/libre-admin-ui:v0.2.1 44 | ports: 45 | - 80:80 46 | environment: 47 | - AUTH0_DOMAIN=demo-libremfg.us.auth0.com 48 | - AUTH0_CLIENT_ID=cEye379jRD9TCroW6LRwsNf7LQkMYOBj 49 | - GRAPHQL_ENDPOINT=http://localhost:4000/graphql 50 | - GRAPHQL_SUBSCRIPTION_ENDPOINT=ws://localhost:8080/graphql 51 | - MQTT_USERNAME=admin 52 | - MQTT_PASSWORD=public 53 | - MQTT_URL=localhost 54 | - MQTT_PORT=8083 55 | depends_on: 56 | - "influxdb" 57 | - "mqtt" 58 | - "alpha" 59 | - "zero" 60 | mqtt: 61 | image: emqx/emqx:4.3.8 62 | ports: 63 | - 1883:1883 64 | - 8083:8083 65 | - 18083:18083 66 | restart: always 67 | environment: 68 | - EMQX_LOADED_PLUGINS=emqx_recon,emqx_retainer,emqx_management,emqx_dashboard,emqx_auth_mnesia 69 | - EMQX_ALLOW_ANONYMOUS=true 70 | - EMQX_ACL_NOMATCH=allow 71 | container_name: mqtt 72 | healthcheck: 73 | interval: 5s 74 | timeout: 3s 75 | retries: 5 76 | test: ["CMD", "curl", "-f", "http://mqtt:18083"] 77 | libre-core: 78 | image: ghcr.io/spruik/libre-core:0.3.8 79 | restart: always 80 | ports: 81 | - 4002:4002 82 | environment: 83 | - LIBRE_CONFIG_FILE=/etc/config/config.json 84 | volumes: 85 | - ./libre-core/config:/etc/config 86 | depends_on: 87 | - "influxdb" 88 | - "mqtt" 89 | - "zero" 90 | - "dgraph-init" 91 | container_name: libre-core 92 | graphql-pubsub: 93 | image: ghcr.io/spruik/graphql-pubsub:0.0.5 94 | restart: always 95 | environment: 96 | - LIBRE_CONFIG_FILE=/etc/config/config.json 97 | volumes: 98 | - ./graphql-pubsub/config:/etc/config 99 | depends_on: 100 | alpha: 101 | condition: service_healthy 102 | mqtt: 103 | condition: service_healthy 104 | influxdb: 105 | condition: service_healthy 106 | container_name: graphql-pubsub 107 | libre-workflow-pubsub: 108 | image: ghcr.io/spruik/libre-workflow-pubsub:0.0.7 109 | restart: always 110 | environment: 111 | - LIBRE_CONFIG_FILE=/etc/config/config.json 112 | volumes: 113 | - ./libre-workflow-pubsub/config:/etc/config 114 | depends_on: 115 | alpha: 116 | condition: service_healthy 117 | mqtt: 118 | condition: service_healthy 119 | influxdb: 120 | condition: service_healthy 121 | container_name: libre-workflow-pubsub 122 | influxdb: 123 | image: influxdb:2.0.7 124 | volumes: 125 | # Mount for influxdb data directory and configuration 126 | - ./influxdb/data:/var/lib/influxdb2:rw 127 | ports: 128 | - "8086:8086" 129 | environment: 130 | # Use these same configurations parameters in your telegraf configuration, mytelegraf.conf. 131 | - DOCKER_INFLUXDB_INIT_MODE=setup 132 | - DOCKER_INFLUXDB_INIT_USERNAME=admin 133 | - DOCKER_INFLUXDB_INIT_PASSWORD=mypasswordmypasswordmypassword 134 | - DOCKER_INFLUXDB_INIT_ORG=Libre 135 | - DOCKER_INFLUXDB_INIT_BUCKET=Libre 136 | - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=mytokenmytokenmytoken 137 | container_name: influxdb 138 | healthcheck: 139 | interval: 5s 140 | timeout: 3s 141 | retries: 5 142 | test: ["CMD", "curl", "-f", "http://influxdb:8086"] 143 | packml-sim: 144 | image: spruiktec/packml-simulator 145 | restart: always 146 | environment: 147 | SITE: PACKML 148 | AREA: SIM 149 | LINE: 'LINE01' 150 | MQTT_URL: mqtt://mqtt:1883 151 | MQTT_USERNAME: admin 152 | MQTT_PASSWORD: public 153 | MQTT_CLIENT_ID: packml_sim 154 | mem_limit: 30MB 155 | depends_on: 156 | alpha: 157 | condition: service_healthy 158 | mqtt: 159 | condition: service_healthy 160 | influxdb: 161 | condition: service_healthy 162 | libre-gateway: 163 | ports: 164 | - 4000:4000 165 | image: ghcr.io/spruik/libre-gateway:0.1.1 166 | restart: always 167 | container_name: libre-gateway 168 | environment: 169 | - GRAPHQL_ENDPOINT=http://alpha:8080 170 | - LIBRE_CORE_ENDPOINT=http://libre-core:4002 171 | - LIBRE_AUTH_CERT_URL=https://demo-libremfg.us.auth0.com/.well-known/jwks.json 172 | volumes: 173 | - type: bind 174 | source: ./libre-gateway/supergraph.graphql 175 | target: /app/supergraph.graphql 176 | - type: bind 177 | source: ./libre-gateway/supergraph.yaml 178 | target: /app/supergraph.yaml 179 | depends_on: 180 | alpha: 181 | condition: service_healthy 182 | mqtt: 183 | condition: service_healthy 184 | influxdb: 185 | condition: service_healthy 186 | healthcheck: 187 | interval: 5s 188 | timeout: 3s 189 | retries: 5 190 | test: ["CMD", "curl", "-f", "http://libre-gateway:4000"] 191 | grafana: 192 | image: grafana/grafana:8.2.1 193 | container_name: grafana 194 | restart: always 195 | environment: 196 | - GF_INSTALL_PLUGINS=fifemon-graphql-datasource,marcusolsson-gantt-panel,isaozler-paretochart-panel,michaeldmoore-multistat-panel 197 | ports: 198 | - "3000:3000" 199 | volumes: 200 | - ./grafana/provisioning:/etc/grafana/provisioning 201 | - ./grafana/plugins:/var/lib/grafana/plugins 202 | - ./grafana/dashboards:/var/lib/grafana/dashboards 203 | - ./grafana/data:/var/lib/grafana 204 | - ./grafana/grafana.ini:/etc/grafana/grafana.ini 205 | depends_on: 206 | - "mqtt" 207 | - "alpha" 208 | - "influxdb" 209 | dgraph-init: 210 | image: dgraph/dgraph:v21.03.1 211 | volumes: 212 | - ./schema:/dgraph/schema 213 | command: > 214 | sh -c "curl -X POST alpha:8080/admin/schema --data-binary '@./schema/libreSchema.sdl' && 215 | dgraph live -f ./schema/g01.rdf.gz -a alpha:9080 -z zero:5080" 216 | container_name: dgraph-init 217 | depends_on: 218 | alpha: 219 | condition: service_healthy 220 | libre-edge-agent: 221 | image: ghcr.io/spruik/libre-edge-agent:0.4.0 222 | restart: always 223 | environment: 224 | - LIBRE_CONFIG_FILE=/etc/config/config.json 225 | volumes: 226 | - ./libre-edge-agent/config:/etc/config 227 | depends_on: 228 | alpha: 229 | condition: service_healthy 230 | mqtt: 231 | condition: service_healthy 232 | influxdb: 233 | condition: service_healthy 234 | container_name: libre-edge-agent 235 | appsmith: 236 | image: appsmith/appsmith-ce:v1.6.6 237 | container_name: appsmith-ce 238 | environment: 239 | - APPSMITH_MAIL_ENABLED=true 240 | - APPSMITH_MAIL_FROM=app@libremfg.ai 241 | - APPSMITH_REPLY_TO=app@libremfg.ai 242 | - APPSMITH_MAIL_HOST=smtp.sendgrid.net 243 | - APPSMITH_MAIL_PORT=587 244 | - APPSMITH_MAIL_SMTP_TLS_ENABLED=true 245 | - APPSMITH_MAIL_USERNAME=apikey 246 | - APPSMITH_MAIL_PASSWORD=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 247 | - APPSMITH_MAIL_SMTP_AUTH=true 248 | - SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_ISSUER-URI=https://demo-libremfg.us.auth0.com/ 249 | - SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_GOOGLE_USER-NAME-ATTRIBUTE=email 250 | - SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT-ID=cEye379jRD9TCroW6LRwsNf7LQkMYOBj 251 | - SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT-SECRET=1QR-caDuhi-UcM0YzgKcip4wIdiTZrljH8K3h8WOHe_Zqg34Vi-7q3V0E6P-0JA0 252 | - SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_AUTHORIZATION-GRANT-TYPE=authorization_code 253 | - SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_REDIRECT-URI={baseUrl}/login/oauth2/code/{registrationId} 254 | ports: 255 | - "3080:80" 256 | - "443:443" 257 | - "9001:9001" 258 | volumes: 259 | - ./stacks:/appsmith-stacks 260 | labels: 261 | com.centurylinklabs.watchtower.enable: "true" 262 | auto_update: 263 | image: containrrr/watchtower:latest-dev 264 | volumes: 265 | - /var/run/docker.sock:/var/run/docker.sock 266 | # Update check interval in seconds. 267 | command: --interval 300 --label-enable --cleanup -------------------------------------------------------------------------------- /Standalone/grafana/dashboards/Line Overview.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "builtIn": 1, 6 | "datasource": "-- Grafana --", 7 | "enable": true, 8 | "hide": true, 9 | "iconColor": "rgba(0, 211, 255, 1)", 10 | "name": "Annotations & Alerts", 11 | "target": { 12 | "limit": 100, 13 | "matchAny": false, 14 | "tags": [], 15 | "type": "dashboard" 16 | }, 17 | "type": "dashboard" 18 | } 19 | ] 20 | }, 21 | "editable": true, 22 | "gnetId": null, 23 | "graphTooltip": 0, 24 | "iteration": 1633575179379, 25 | "links": [], 26 | "panels": [ 27 | { 28 | "datasource": "Historian", 29 | "fieldConfig": { 30 | "defaults": { 31 | "color": { 32 | "mode": "thresholds" 33 | }, 34 | "mappings": [ 35 | { 36 | "options": { 37 | "0": { 38 | "color": "dark-red", 39 | "index": 2, 40 | "text": "Held" 41 | }, 42 | "1": { 43 | "color": "dark-red", 44 | "index": 1, 45 | "text": "Held" 46 | }, 47 | "6": { 48 | "color": "super-light-green", 49 | "index": 0, 50 | "text": "Execute" 51 | } 52 | }, 53 | "type": "value" 54 | } 55 | ], 56 | "thresholds": { 57 | "mode": "absolute", 58 | "steps": [ 59 | { 60 | "color": "green", 61 | "value": null 62 | }, 63 | { 64 | "color": "red", 65 | "value": 80 66 | } 67 | ] 68 | } 69 | }, 70 | "overrides": [] 71 | }, 72 | "gridPos": { 73 | "h": 3, 74 | "w": 8, 75 | "x": 0, 76 | "y": 0 77 | }, 78 | "id": 8, 79 | "options": { 80 | "colorMode": "value", 81 | "graphMode": "area", 82 | "justifyMode": "center", 83 | "orientation": "auto", 84 | "reduceOptions": { 85 | "calcs": [ 86 | "lastNotNull" 87 | ], 88 | "fields": "/.*/", 89 | "values": true 90 | }, 91 | "text": { 92 | "valueSize": 60 93 | }, 94 | "textMode": "value" 95 | }, 96 | "pluginVersion": "8.1.3", 97 | "targets": [ 98 | { 99 | "aliasBy": "", 100 | "annotationTags": "", 101 | "annotationText": "", 102 | "annotationTitle": "", 103 | "constant": 6.5, 104 | "dataPath": "data", 105 | "endTimePath": "endTime", 106 | "groupBy": "", 107 | "query": "from(bucket: \"Libre\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"eventLog\")\n |> filter(fn: (r) => r[\"equipmentId\"] == \"${line}\") \n |> filter(fn: (r) => r[\"_field\"] == \"packMLStatus\") \n |> last()\n |> pivot(rowKey:[\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\") \n |> drop(columns: [\"_start\", \"_stop\",\"_time\",\"_field\",\"_measurement\",\"equipmentId\",\"previousTimestamp\"])", 108 | "queryText": "query {\n data:submissions(user:\"$user\"){\n Time:submitTime\n idle running completed\n }\n}", 109 | "refId": "A", 110 | "timeFormat": null, 111 | "timePath": "Time" 112 | } 113 | ], 114 | "transformations": [], 115 | "transparent": true, 116 | "type": "stat" 117 | }, 118 | { 119 | "datasource": "MKG", 120 | "fieldConfig": { 121 | "defaults": { 122 | "color": { 123 | "mode": "thresholds" 124 | }, 125 | "custom": { 126 | "fillOpacity": 100, 127 | "lineWidth": 0 128 | }, 129 | "mappings": [ 130 | { 131 | "options": { 132 | "Execute": { 133 | "color": "#808080", 134 | "index": 0 135 | }, 136 | "Held": { 137 | "color": "dark-red", 138 | "index": 1 139 | }, 140 | "Suspended": { 141 | "color": "super-light-orange", 142 | "index": 2 143 | } 144 | }, 145 | "type": "value" 146 | } 147 | ], 148 | "thresholds": { 149 | "mode": "absolute", 150 | "steps": [ 151 | { 152 | "color": "green", 153 | "value": null 154 | } 155 | ] 156 | }, 157 | "unit": "dtdhms" 158 | }, 159 | "overrides": [] 160 | }, 161 | "gridPos": { 162 | "h": 3, 163 | "w": 24, 164 | "x": 0, 165 | "y": 3 166 | }, 167 | "id": 2, 168 | "options": { 169 | "alignValue": "left", 170 | "legend": { 171 | "displayMode": "list", 172 | "placement": "bottom" 173 | }, 174 | "mergeValues": false, 175 | "rowHeight": 1, 176 | "showValue": "never", 177 | "tooltip": { 178 | "mode": "single" 179 | } 180 | }, 181 | "pluginVersion": "8.1.3", 182 | "targets": [ 183 | { 184 | "aliasBy": "", 185 | "annotationTags": "", 186 | "annotationText": "", 187 | "annotationTitle": "", 188 | "constant": 6.5, 189 | "dataPath": "getEquipment.Events", 190 | "endTimePath": "endTime", 191 | "groupBy": "", 192 | "queryText": "query{\n getEquipment(id:\"${line}\"){\n id\n label\n Events:eventsByField(filter:{from:\"${__from:date:iso}\",to:\"${__to:date:iso}\",interpolateAtRangeBoundary:true}){\n s:packMLStatus\n startDateTime\n }\n }\n}", 193 | "refId": "A", 194 | "timeFormat": null, 195 | "timePath": "startDateTime" 196 | } 197 | ], 198 | "transformations": [ 199 | { 200 | "id": "sortBy", 201 | "options": { 202 | "fields": {}, 203 | "sort": [ 204 | { 205 | "field": "startDateTime" 206 | } 207 | ] 208 | } 209 | } 210 | ], 211 | "transparent": true, 212 | "type": "state-timeline" 213 | }, 214 | { 215 | "datasource": "Historian", 216 | "fieldConfig": { 217 | "defaults": { 218 | "color": { 219 | "mode": "palette-classic" 220 | }, 221 | "custom": { 222 | "axisLabel": "", 223 | "axisPlacement": "auto", 224 | "barAlignment": 0, 225 | "drawStyle": "line", 226 | "fillOpacity": 0, 227 | "gradientMode": "none", 228 | "hideFrom": { 229 | "legend": false, 230 | "tooltip": false, 231 | "viz": false 232 | }, 233 | "lineInterpolation": "stepAfter", 234 | "lineWidth": 1, 235 | "pointSize": 5, 236 | "scaleDistribution": { 237 | "type": "linear" 238 | }, 239 | "showPoints": "auto", 240 | "spanNulls": false, 241 | "stacking": { 242 | "group": "A", 243 | "mode": "none" 244 | }, 245 | "thresholdsStyle": { 246 | "mode": "off" 247 | } 248 | }, 249 | "mappings": [], 250 | "thresholds": { 251 | "mode": "absolute", 252 | "steps": [ 253 | { 254 | "color": "green", 255 | "value": null 256 | }, 257 | { 258 | "color": "red", 259 | "value": 80 260 | } 261 | ] 262 | } 263 | }, 264 | "overrides": [] 265 | }, 266 | "gridPos": { 267 | "h": 6, 268 | "w": 24, 269 | "x": 0, 270 | "y": 6 271 | }, 272 | "id": 12, 273 | "options": { 274 | "legend": { 275 | "calcs": [], 276 | "displayMode": "list", 277 | "placement": "bottom" 278 | }, 279 | "tooltip": { 280 | "mode": "single" 281 | } 282 | }, 283 | "targets": [ 284 | { 285 | "query": "from(bucket: \"Libre\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"EquipmentPropertyValues\")\n |> filter(fn: (r) => contains(value: r[\"propId\"], set: ${properties:json}))\n |> filter(fn: (r) => r[\"equipmentId\"] == \"${line}\")\n |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: true)\n |> yield(name: \"last\")", 286 | "refId": "A" 287 | } 288 | ], 289 | "title": "Performance", 290 | "type": "timeseries" 291 | }, 292 | { 293 | "datasource": "MKG", 294 | "gridPos": { 295 | "h": 7, 296 | "w": 24, 297 | "x": 0, 298 | "y": 12 299 | }, 300 | "id": 14, 301 | "options": { 302 | "eventMetric": "Events", 303 | "reasonMetric": "Reasons" 304 | }, 305 | "targets": [ 306 | { 307 | "aliasBy": "", 308 | "annotationTags": "", 309 | "annotationText": "", 310 | "annotationTitle": "", 311 | "constant": 6.5, 312 | "dataPath": "getEquipment", 313 | "endTimePath": "endTime", 314 | "groupBy": "", 315 | "queryText": "query {\n getEquipment(id:\"${line}\"){\n id\n name\n }\n}", 316 | "refId": "Equipment", 317 | "timeFormat": null, 318 | "timePath": "Time" 319 | }, 320 | { 321 | "aliasBy": "", 322 | "annotationTags": "", 323 | "annotationText": "", 324 | "annotationTitle": "", 325 | "constant": 6.5, 326 | "dataPath": "getEquipment.Events", 327 | "endTimePath": "endTime", 328 | "groupBy": "", 329 | "hide": false, 330 | "queryText": "query{\n getEquipment(id:\"${line}\"){\n id\n label\n Events:eventsByField(filter:{filterField:\"packMLStatus\",filterValue:\"Execute\",from:\"${__from:date:iso}\",to:\"${__to:date:iso}\"}){\n packMLStatus\n startDateTime\n endDateTime\n duration\n reasonCategoryCode\n reasonCode\n reasonText\n }\n }\n}", 331 | "refId": "Events", 332 | "timeFormat": null, 333 | "timePath": "startDateTime" 334 | }, 335 | { 336 | "aliasBy": "", 337 | "annotationTags": "", 338 | "annotationText": "", 339 | "annotationTitle": "", 340 | "constant": 6.5, 341 | "dataPath": "getEquipment.Reasons", 342 | "endTimePath": "endTime", 343 | "groupBy": "", 344 | "hide": false, 345 | "queryText": "query{\n getEquipment(id:\"$line\"){\n id\n label\n Reasons:reasonListWithOverrides(filter:{not:{has:parent}}){\n id\n isActive\n class\n label\n text\n parent{id}\n standardValue\n category{code}\n }\n }\n}", 346 | "refId": "Reasons", 347 | "timeFormat": null, 348 | "timePath": "Time" 349 | }, 350 | { 351 | "aliasBy": "", 352 | "annotationTags": "", 353 | "annotationText": "", 354 | "annotationTitle": "", 355 | "constant": 6.5, 356 | "dataPath": "getEquipment.Reasons", 357 | "endTimePath": "endTime", 358 | "groupBy": "", 359 | "hide": false, 360 | "queryText": "query{\n getEquipment(id:\"$line\"){\n id\n label\n Reasons:reasonListWithOverrides(filter:{has:parent}){\n id\n isActive\n class\n label\n text\n parent{id}\n standardValue\n category{code}\n }\n }\n}", 361 | "refId": "ReasonsWithParents", 362 | "timeFormat": null, 363 | "timePath": "Time" 364 | } 365 | ], 366 | "title": "Panel Title", 367 | "type": "libre-event-editor-table-panel" 368 | } 369 | ], 370 | "refresh": "10s", 371 | "schemaVersion": 30, 372 | "style": "dark", 373 | "tags": [], 374 | "templating": { 375 | "list": [ 376 | { 377 | "allValue": null, 378 | "current": { 379 | "selected": true, 380 | "text": "Vandelay", 381 | "value": "0x12" 382 | }, 383 | "datasource": "MKG", 384 | "definition": "query{\n queryEquipment(filter:{not:{has:parent},and:{not:{isActive:false}}}){\n __text: name\n __value: id\n }\n} (queryEquipment)", 385 | "description": "Sites", 386 | "error": null, 387 | "hide": 0, 388 | "includeAll": false, 389 | "label": "site", 390 | "multi": false, 391 | "name": "site", 392 | "options": [], 393 | "query": { 394 | "dataPath": "queryEquipment", 395 | "queryText": "query{\n queryEquipment(filter:{not:{has:parent},and:{not:{isActive:false}}}){\n __text: name\n __value: id\n }\n}" 396 | }, 397 | "refresh": 1, 398 | "regex": "", 399 | "skipUrlSync": false, 400 | "sort": 0, 401 | "type": "query" 402 | }, 403 | { 404 | "allValue": null, 405 | "current": { 406 | "selected": true, 407 | "text": "PKG", 408 | "value": "0x13" 409 | }, 410 | "datasource": "MKG", 411 | "definition": "query{\n getEquipment(id:\"$site\"){\n children(filter:{not:{isActive:false}}){\n __text: label\n __value: id\n }\n }\n} (getEquipment.children)", 412 | "description": "Areas", 413 | "error": null, 414 | "hide": 0, 415 | "includeAll": false, 416 | "label": "area", 417 | "multi": false, 418 | "name": "area", 419 | "options": [], 420 | "query": { 421 | "dataPath": "getEquipment.children", 422 | "queryText": "query{\n getEquipment(id:\"$site\"){\n children(filter:{not:{isActive:false}}){\n __text: label\n __value: id\n }\n }\n}" 423 | }, 424 | "refresh": 1, 425 | "regex": "", 426 | "skipUrlSync": false, 427 | "sort": 0, 428 | "type": "query" 429 | }, 430 | { 431 | "allValue": null, 432 | "current": { 433 | "selected": false, 434 | "text": "GloveLine01", 435 | "value": "0x14" 436 | }, 437 | "datasource": "MKG", 438 | "definition": "query{\n getEquipment(id:\"$area\"){\n children(filter:{not:{isActive:false}}){\n __text: label\n __value: id\n }\n }\n} (getEquipment.children)", 439 | "description": "Line", 440 | "error": null, 441 | "hide": 0, 442 | "includeAll": false, 443 | "label": "line", 444 | "multi": false, 445 | "name": "line", 446 | "options": [], 447 | "query": { 448 | "dataPath": "getEquipment.children", 449 | "queryText": "query{\n getEquipment(id:\"$area\"){\n children(filter:{not:{isActive:false}}){\n __text: label\n __value: id\n }\n }\n}" 450 | }, 451 | "refresh": 1, 452 | "regex": "", 453 | "skipUrlSync": false, 454 | "sort": 0, 455 | "type": "query" 456 | }, 457 | { 458 | "allValue": null, 459 | "current": { 460 | "selected": true, 461 | "text": [ 462 | "SpeedActual" 463 | ], 464 | "value": [ 465 | "0x1b" 466 | ] 467 | }, 468 | "datasource": "MKG", 469 | "definition": "query{\n getEquipment(id:\"${line}\"){\n name\n props:propertyListWithOverrides{\n __text:name\n __value:id\n }\n }\n} (getEquipment.props)", 470 | "description": null, 471 | "error": null, 472 | "hide": 0, 473 | "includeAll": false, 474 | "label": null, 475 | "multi": true, 476 | "name": "properties", 477 | "options": [], 478 | "query": { 479 | "dataPath": "getEquipment.props", 480 | "queryText": "query{\n getEquipment(id:\"${line}\"){\n name\n props:propertyListWithOverrides{\n __text:name\n __value:id\n }\n }\n}" 481 | }, 482 | "refresh": 1, 483 | "regex": "", 484 | "skipUrlSync": false, 485 | "sort": 0, 486 | "type": "query" 487 | } 488 | ] 489 | }, 490 | "time": { 491 | "from": "now-6h", 492 | "to": "now" 493 | }, 494 | "timepicker": {}, 495 | "timezone": "", 496 | "title": "Line Overview", 497 | "uid": "q45UmQI7k", 498 | "version": 37 499 | } -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## v1.3.0 4 | 5 | - **improvement** Support key/value variables (@retzkek #48) 6 | - **improvement** Configurable timePath and timeFormat (@retzkek #49) 7 | - **documentation** rewrite examples to use the test data source, which provides 8 | an example server and dashboard that [users can 9 | install](https://github.com/fifemon/graphql-test-source) to learn and 10 | experiment with. (@retzkek #51) 11 | 12 | ## v1.2.0 13 | 14 | - **improvement** Add support for dashboard variable queries (@ggranberry #38) 15 | - **bug fix** Properly scope variables, fixes repeated panel queries (@retzkek #41) 16 | 17 | ## v1.1.4 18 | 19 | - **improvement** Use templateSrv to interpolate timeFrom and timeTo variables. (@carvid #31) 20 | - **bug fix** Fix error in isRFC3339_ISO6801 when field is non-string (@ricochet1k #32, @retzkek #33) 21 | 22 | ## v1.1.3 23 | 24 | - use `QueryField` component for a nicer query editing experience (@michaelneale #24) 25 | - packaging, documentation, and testing improvements (@michaelneale #27, @retzkek #29) 26 | - **DEPRECATED**: no more Grafana 6 releases 27 | 28 | ## v1.1.2 29 | 30 | - Fix aliases in Grafana 7 31 | 32 | ## v1.1.1 33 | 34 | - Fixes error when null field in response 35 | 36 | ## v1.1.0 37 | 38 | - **BREAKING**: top-level `data` should no longer be included in data paths 39 | - support multiple data paths, comma-separated 40 | 41 | ## v1.0.0 42 | 43 | Initial release, basic support for tabular and timeseries data and annotations. 44 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2019 FERMI NATIONAL ACCELERATOR LABORATORY (FERMILAB) 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License 14 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/MANIFEST.txt: -------------------------------------------------------------------------------- 1 | 2 | -----BEGIN PGP SIGNED MESSAGE----- 3 | Hash: SHA512 4 | 5 | { 6 | "manifestVersion": "2.0.0", 7 | "signatureType": "community", 8 | "signedByOrg": "fifemon", 9 | "signedByOrgName": "FIFEmon", 10 | "plugin": "fifemon-graphql-datasource", 11 | "version": "1.3.0", 12 | "time": 1615915623180, 13 | "keyId": "7e4d0c6a708866e7", 14 | "files": { 15 | "module.js.map": "7925820737035c14a0eebdf8489d96fdf974b6c81b0282d98397741bc9487ad1", 16 | "partials/annotations.editor.html": "853304dc1a489056877366f6c43e574fed8ccfb3603c6973590606e8f556cb7a", 17 | "CHANGELOG.md": "090a3711a33dd2d094a5815d88f379a83d1d09cb249cd15e2bab05248af5dd45", 18 | "README.md": "acd4e7e511bc898a090bfec9a4f5e08380aafb602df5a03afbde792194b2a4e9", 19 | "index.html": "2fa2c4168c5bb7b8502989f437e4a1a71e663702b0ec9c01530215c8c026dcaf", 20 | "module.js": "c80e004740f5b48199dd33dd869e14250a42551788d127ad27ae79e807dea146", 21 | "plugin.json": "70924eca954adfcfc8e5ae2f38c83ffde969898be2814d925ddfdf2f62a92c41", 22 | "img/db_arrivals.png": "e8b7aba490ac43bc801b9739cca8408bb9c247aca102a02ec612c396c73b4b31", 23 | "img/logo.svg": "3f359408b247bdd53517f653fbad65ee067d9cdb338ec5d438bd98f081f81b59", 24 | "img/README": "15d4389999e277a1749d107ed84e099e38089b88d74c6ab33ed6771087d162f4", 25 | "img/db_arrivals_annotations.png": "99a3e09181a74140f61be7cdb6bbd86d92657e66a21961b3c8cb9d6c5fef1986", 26 | "img/github_security_advisories.png": "b11ce1951842ff426f6a3f4adc79f14ce66d1e73da761911a1cefc74dbf8c0cd", 27 | "LICENSE": "8296125b6632f7fcaa2c69d2837a7bb188c2767ae23461db27b8a7f6756cdf55" 28 | } 29 | } 30 | -----BEGIN PGP SIGNATURE----- 31 | Version: OpenPGP.js v4.10.1 32 | Comment: https://openpgpjs.org 33 | 34 | wqAEARMKAAYFAmBQ6mcACgkQfk0ManCIZucGswIIuPLI678s80lQzGnp6Dyp 35 | /C/kIwhRINO+Gd1pV1kMV3oiu9aklVfDCJgkFkxBZE+zBydJkrA0cIJqPIGI 36 | BR/2VQ4CBAnoYv6XdgL4/mtfgUgkEjk1sX/LbJMRSY+HHvcP0s9K/CBgkAut 37 | Ex0+bXPPP4PBc9QK7Ff76/hRveQncKcKE+kx 38 | =5iiS 39 | -----END PGP SIGNATURE----- 40 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/README.md: -------------------------------------------------------------------------------- 1 | # GraphQL Data Source 2 | 3 | ![CI](https://github.com/fifemon/graphql-datasource/workflows/CI/badge.svg) 4 | 5 | [Grafana](https://grafana.com) datasource plugin that provides access to a 6 | GraphQL API for numerical timeseries data, general/tabular data, 7 | annotations, and dashboard variables. 8 | 9 | - The GraphQL query must be structured so that the data of interest is returned 10 | under the configurable data path (default `data`) in the response. If the 11 | object at that path is an array it will be iterated over, with each object added 12 | as a row in the data frame, otherwise the result object will be the only row. 13 | - Can be separated by commas to use multiple data paths 14 | - Timeseries data must include a timestamp field under the data path, default 15 | `Time`, in [ISO8601](https://momentjs.com/docs/#/parsing/string/) or a 16 | configurable [custom 17 | format](https://momentjs.com/docs/#/parsing/string-format/). 18 | - Nested types will be flattened into dot-delimited fields. 19 | - Grafana variables should be substituted directly in the query (instead of 20 | using GraphQL variables). The dashboard time ranges are available in the 21 | [global variables](https://grafana.com/docs/grafana/latest/variables/variable-types/global-variables/) 22 | `$__from` and `$__to` as millisecond epoch (or in whatever format is needed by the API 23 | in Grafana 7.1.2 or later). 24 | - Group by can be used to group elements into multiple data points. 25 | - Alias by is used to alter the name of the field displayed in the legend. 26 | `$field_` is substituted with the values of the field and 27 | `$fieldName` is substituted with the name of the field. 28 | 29 | # Screenshots 30 | 31 | ![DeutscheBahn Arrivals Table](https://user-images.githubusercontent.com/1627510/90258294-f1bf2b00-de0d-11ea-8768-34b4ef37c125.png) 32 | ![DeutscheBahn Arrivals Annotations](https://user-images.githubusercontent.com/1627510/90258316-f8e63900-de0d-11ea-91eb-d40532d5b768.png) 33 | ![GitHub Security Advisories](https://user-images.githubusercontent.com/1627510/90258319-fbe12980-de0d-11ea-8ea2-c97bbc398aa4.png) 34 | ![DeutscheBahn Station Variable](https://user-images.githubusercontent.com/1627510/110505565-e1c9aa00-80c3-11eb-85bb-10e5471fb151.png) 35 | 36 | # Examples 37 | 38 | Below are some example queries demonstrating how to use the plugin, using the 39 | [FIFEMon GraphQL test source 40 | server](https://github.com/fifemon/graphql-test-source/), which also includes a 41 | [dashboard](https://raw.githubusercontent.com/fifemon/graphql-test-source/master/doc/graphql-test-dashboard.json) 42 | demonstrating these queries. 43 | 44 | ## Basic timeseries 45 | 46 | ```graphql 47 | query { 48 | data: simple_series(from: "${__from:date:iso}", to: "${__to:date:iso}", interval_ms: $__interval_ms) { 49 | Time: timestamp 50 | value 51 | } 52 | } 53 | ``` 54 | 55 | Note the use of the global `$__from` and `$__to` variables to insert the 56 | dashboard time range into the query and the use of `$__interval_ms` to specify 57 | the appropriate time interval for the graph. 58 | 59 | ## Custom time format 60 | 61 | ```graphql 62 | query { 63 | simple_series( 64 | from: "${__from:date:iso}" 65 | to: "${__to:date:iso}" 66 | interval_ms: $__interval_ms 67 | format: "MM.dd.uuuu HHmmss" 68 | ) { 69 | timestamp 70 | value 71 | } 72 | } 73 | ``` 74 | 75 | - Data path: `simple_series` 76 | - Time path: `timestamp` 77 | - Time format: `MM.DD.YYYY HHmmss` 78 | 79 | ## Alias and group by 80 | 81 | ```graphql 82 | query { 83 | complex_series(from: "${__from:date:iso}", to: "${__to:date:iso}", interval_ms: $__interval_ms) { 84 | time { 85 | timestamp 86 | } 87 | value 88 | group { 89 | id 90 | name 91 | } 92 | } 93 | } 94 | ``` 95 | 96 | - Data path: `complex_series` 97 | - Time path: `time.timestamp` 98 | - Group by: `group.id` 99 | - Alias by: `$field_group.name` 100 | 101 | In the above example, "Group by" and "Alias by" are defined. "Group by" allows 102 | you to split up an array of data into multiple data points. "Alias by" is used 103 | as the name of the data point. You can make alias use text from the query or 104 | even the field name by using `$field_` for the value of the 105 | field, or `$fieldName` for the name of the field. If `$fieldName` was used, it 106 | would be replaced by "value" because that's the name of the field. If 107 | `$field_group.name` was used, it would be replaced with the value 108 | of `name`. Using `$fieldName` can be useful if you're querying multiple 109 | numeric fields that you want displayed in your graph. 110 | 111 | ## Annotations 112 | 113 | ```graphql 114 | query { 115 | events(from: "${__from:date:iso}", to: "${__to:date:iso}", end: true) { 116 | timestamp 117 | end_timestamp 118 | name 119 | description 120 | tags 121 | } 122 | } 123 | ``` 124 | 125 | - Data path: `events` 126 | - Time path: `timestamp` 127 | - End time path: `end_timestamp` 128 | - Title: `$field_name` 129 | - Text: `$field_description` 130 | - Tags: `tag1, tag2` 131 | 132 | The above annotation example is similar to regular queries. You are able to 133 | define a data path, time path, and time format. Similar to the last example, you 134 | can also substitute values into the title, text, and tags by using 135 | `$field_`. Tags are separated by commas. The above example has two 136 | tags: "tag1" and "tag2". 137 | 138 | If the optional end time field is defined and present, the annotation will be 139 | shown over a period of time. 140 | 141 | ## Dashboard Variable Queries 142 | 143 | Dashboard variables can be populated by a GraphQL query that returns an array of 144 | objects. If the objects contain both `__text` and `__value` fields then they 145 | will be used (the `__text` field will be displayed, the `__value` field will be 146 | used in substitutions). Otherwise the values of all fields will be appended to 147 | the variable value list. 148 | 149 | ```graphql 150 | query { 151 | groups { 152 | __value: id 153 | __text: name 154 | } 155 | } 156 | ``` 157 | 158 | - Data path: `groups` 159 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/img/README: -------------------------------------------------------------------------------- 1 | GraphQL Logo Copyright © 2015-2018, Facebook, Inc. Copyright © 2019-present, GraphQL Foundation 2 | Obtained from: https://github.com/graphql/graphql-spec/blob/master/resources/GraphQL%20Logo.svg 3 | Used under the terms of the Open Web Foundation Final Specification Agreement (OWFa 1.0) per 4 | https://github.com/graphql/graphql-spec/blob/master/spec/GraphQL.md -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/img/db_arrivals.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/grafana/plugins/fifemon-graphql-datasource/img/db_arrivals.png -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/img/db_arrivals_annotations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/grafana/plugins/fifemon-graphql-datasource/img/db_arrivals_annotations.png -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/img/github_security_advisories.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/grafana/plugins/fifemon-graphql-datasource/img/github_security_advisories.png -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 72 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Webpack App 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/partials/annotations.editor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 |
9 | 18 |
19 | 20 |
21 | 26 |
27 | 28 |
29 | 33 |
34 | 35 |
36 | 41 |
42 | 43 |
44 | 48 |
49 | 50 |
51 | 56 |
57 | 58 |
59 | 64 |
65 | 66 |
67 | 71 |
72 |
73 | 74 | 75 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/fifemon-graphql-datasource/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "datasource", 3 | "name": "GraphQL Data Source", 4 | "id": "fifemon-graphql-datasource", 5 | "metrics": true, 6 | "annotations": true, 7 | 8 | "info": { 9 | "description": "GraphQL Data Source", 10 | "author": { 11 | "name": "Kevin Retzke" 12 | }, 13 | "keywords": ["GraphQL"], 14 | "logos": { 15 | "small": "img/logo.svg", 16 | "large": "img/logo.svg" 17 | }, 18 | "links": [ 19 | { "name": "Website", "url": "https://github.com/fifemon/graphql-datasource" }, 20 | { "name": "License", "url": "https://github.com/fifemon/graphql-datasource/blob/master/LICENSE" } 21 | ], 22 | "screenshots": [ 23 | { "name": "DeutscheBahn Arrivals", "path": "img/db_arrivals.png"}, 24 | { "name": "DeutscheBahn Arrivals Annotations", "path": "img/db_arrivals_annotations.png"}, 25 | { "name": "GitHub Security Advisories", "path": "img/github_security_advisories.png"} 26 | ], 27 | "version": "1.3.0", 28 | "updated": "2021-03-16" 29 | }, 30 | 31 | "dependencies": { 32 | "grafanaVersion": "7.x.x", 33 | "grafanaDependency": ">=7.0.0", 34 | "plugins": [] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/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 {yyyy} {name of copyright owner} 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 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/MANIFEST.txt: -------------------------------------------------------------------------------- 1 | 2 | -----BEGIN PGP SIGNED MESSAGE----- 3 | Hash: SHA512 4 | 5 | { 6 | "manifestVersion": "2.0.0", 7 | "signatureType": "community", 8 | "signedByOrg": "isaozler", 9 | "signedByOrgName": "isaozler", 10 | "plugin": "isaozler-paretochart-panel", 11 | "version": "0.3.2", 12 | "time": 1634578771777, 13 | "keyId": "7e4d0c6a708866e7", 14 | "files": { 15 | "README.md": "f0f6cc5bedf2ae869608d7c92e1279b928927a677325109e86792b02784e879b", 16 | "LICENSE": "b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1", 17 | "module.js": "4e9e68d002a5f30100b50c4f90a9f9590fb449b0e0765dbd6e7744f9dfc3bfbd", 18 | "module.js.LICENSE.txt": "0d8f66cd4afb566cb5b7e1540c68f43b939d3eba12ace290f18abc4f4cb53ed0", 19 | "img/logo.svg": "e7c5922188799e8471cc135b191d78b9ad8a3f1480c5e14e2310867d23c6b40e", 20 | "img/machines--icon.svg": "b876d9beeec3ba18949b31a4777a06f60c90e5192e3794fadab69e92c4980d23", 21 | "img/production-env--impression.jpg": "ac0a3f596f3058500935563be4fac11a51902663d267ee8c9d5b075650049630", 22 | "img/pareto-chart-edit-panel.jpg": "d20e4634c6b5de6e0432503a8e155c89ba6a4ffd29d748ae10b7da208eeca9aa", 23 | "index.html": "2fa2c4168c5bb7b8502989f437e4a1a71e663702b0ec9c01530215c8c026dcaf", 24 | "plugin.json": "c832698cb5f2eeec85fca1cd85081f2af35b5eb6ce27a9292fa2dd7966755e3d", 25 | "module.js.map": "0739a317602f0de352a62fcb6afce7f38291caca87edb8deb835de2dd05ab295" 26 | } 27 | } 28 | -----BEGIN PGP SIGNATURE----- 29 | Version: OpenPGP.js v4.10.1 30 | Comment: https://openpgpjs.org 31 | 32 | wqIEARMKAAYFAmFtsVMACgkQfk0ManCIZueUmwIJAVkLXZanpUyVBcWWc17f 33 | rfJp0qfpSliF1bkK9BCBY33MCcStped/+HQv4xIbRnSfdIvg3a0AFSlv9Kuq 34 | xlti71KNAgkBZ3ZAINK59BfWh7/NPC7UCLvcG6yIvjkUohjcrbM98uoJ32wK 35 | ug96y5NnrhLM/wpswLuHSR17ycirkcmCzIRvJq8= 36 | =ienU 37 | -----END PGP SIGNATURE----- 38 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/README.md: -------------------------------------------------------------------------------- 1 | # Grafana Pareto Panel Plugin 2 | 3 | ![Edit Panel](https://raw.githubusercontent.com/isaozler/pareto-chart/releases/latest/src/img/pareto-chart-edit-panel.jpg) 4 | 5 | This plugin provides you the ability to draw a Pareto chart with `RDB` and `TimeSeries databases`. 6 | 7 | ## Features 8 | - Configurable vital few and trivial many lines 9 | - Pan and zoom for detailed info without changing date range 10 | - Set decimals count on displayed values 11 | - Specify bar spacing 12 | - Quickly copy bar data to clipboard simply by clicking on the bar 13 | - Option to show/hide bar values on default 14 | - Style graphs to need 15 | 16 | # TimeSeries (InfluxDB) dashboard impression 17 | 18 | ![Dashboard impression](https://raw.githubusercontent.com/isaozler/pareto-chart/releases/latest/src/img/production-env--impression.jpg) 19 | 20 | ## MySQL Example 21 | 22 | Provide the `defects` which could be "categories" (type **string**) for example and a `frequency` value cummulatives/counts (type **number**). 23 | 24 | | Defects | Counts | 25 | | :-: | :-: | 26 | | Error 1 | 10 | 27 | | Error 2 | 4 | 28 | | Error 3 | 1 | 29 | | ... | ... | 30 | 31 | ## Example Query 32 | 33 | ```sql 34 | SELECT _label_, _count_, ... 35 | FROM _table_ 36 | ``` 37 | --- 38 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Group 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/img/pareto-chart-edit-panel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/grafana/plugins/isaozler-paretochart-panel/img/pareto-chart-edit-panel.jpg -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/img/production-env--impression.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/grafana/plugins/isaozler-paretochart-panel/img/production-env--impression.jpg -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Webpack App 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/module.js: -------------------------------------------------------------------------------- 1 | /*! For license information please see module.js.LICENSE.txt */ 2 | define(["react","d3","emotion","@grafana/data","@grafana/ui"],(function(e,t,n,a,r){return function(e){var t={};function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(t){return e[t]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=5)}([function(t,n){t.exports=e},function(e,n){e.exports=t},function(e,t){e.exports=n},function(e,t){e.exports=a},function(e,t){e.exports=r},function(e,t,n){"use strict";n.r(t);var a=n(3);var r=function(){return(r=Object.assign||function(e){for(var t,n=1,a=arguments.length;n0)&&!(a=i.next()).done;)o.push(a.value)}catch(e){r={error:e}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return o}function o(){for(var e=[],t=0;t=30?t.textLabel.__largeBar+" --large":e<30&&n%a==0?t.textLabel.__smallBar+" --small":t.textLabel.__hidden+" --hidden"},h=function(e,t){var n;return function(){for(var a=[],r=0;r=0?e.toFixed(_>6?2:_):e,v=!E?n.forcedHidden.__barLabel:"";o=!S&&0===a||(t.p[a]=5;t.select("rect.selection").classed("selection--valid",u).classed("selection--invalid",!u)}})).on("end",s),p=function(){var n,a=Object(f.select)(e.svgRef.current);if(a){var r=null===(n=Object(f.select)(e.svgRef.current))||void 0===n?void 0:n.transition().duration(750);a.select(".axis-left").transition(r).call(Object(f.axisLeft)(e.y)),a.select(".axis-right").transition(r).call(Object(f.axisLeft)(e.p).ticks(4).tickFormat(e.pLabels));var i=0,o=0,l=e.xBand.bandwidth(),s=l/2,c=a.selectAll("rect."+t.bar);if(c.each((function(){if(this.dataset){var t=e.x(i)-s,n=this.dataset.isVital;if(o="true"===n?i:o,Object(f.select)(this).transition(r).attr("x",t).attr("width",l),e.showBarText&&Object(f.select)("#barTextGroup-"+i).transition(r).style("transform","translate("+(t+s)+"px, "+(e.chartHeight-10)+"px) rotate("+e.barTextRotation+"deg)"),e.showVitalFew&&i===c.size()-1){var u=e.x(o)-s+s;a.select(".line--vertical").transition(r).attr("x1",u).attr("x2",u).attr("y1",0).attr("y2",e.chartHeight)}}i++})),e.showBarValue){var u=Math.trunc(e.chartWidth/10/l);a.selectAll("text."+t.barValue).each((function(){var n=this.dataset.index,a=e.x(+n)-s,i=b(l,t,+n,u);Object(f.select)(this).transition(r).attr("class",[t.barValue,i].join(" ")).attr("x",a+s)}))}var d=e.p(e.vitalBreakpointVal/100);a.select(".line--horizontal").transition(r).attr("x1",0).attr("x2",e.chartWidth-e.padding).attr("y1",d).attr("y2",d),a.select(".line--curve").datum(e.pathData).transition(r).attr("transform","translate("+e.padding+", 0)").attr("d",e.line)}},h=Object(c.useCallback)((function(){Object(f.select)(e.svgRef.current).select(".brush").call(d.move,null),s()}),[f.select,s]);return Object(c.useLayoutEffect)((function(){h()}),[]),Object(c.useEffect)((function(){h()}),[e.data,h]),u.a.createElement("g",{transform:"translate("+2*e.padding+", "+(e.padding+e.chartHeight+3)+")",className:["brush",t.brushWrapper].join(" "),ref:function(e){Object(f.select)(e).call(d)}})},Q={initCopyText:"Click on bar to copy data",copyText:"",dataCopied:"Copied data!"},J=function(e,t){return''+t+""},Z=function(e){var t=q(),n=Object(c.useRef)(null),a=Object(c.useRef)(null),r=function(t){ee(n,e,t)},i=function(t){$(n,a,e,t)};return Object(c.useEffect)((function(){return x(e.chartId+"-"+s.E_TOOLTIP_CLICK,r),x(e.chartId+"-"+s.E_TOOLTIP_MOVE,i),function(){g(e.chartId+"-"+s.E_TOOLTIP_CLICK,r),g(e.chartId+"-"+s.E_TOOLTIP_MOVE,i)}}),[]),u.a.createElement("div",{ref:n,className:["tooltip__container",t.tooltipContainer,e.chartId].join(" ")},u.a.createElement("div",{ref:a,className:t.tooltip}))},$=function(e,t,n,a){var r,i=(e||{current:null}).current,o=(t||{current:null}).current,l=(null===(r=a.currentTarget)||void 0===r?void 0:r.dataset)||{},s=l.labelHeader,c=l.label,u=l.label2,d=l.isVital,p=l.count,b=l.fillColor,h=!!["mouseover","mousemove"].includes(a.type);"mouseout"===a.type&&(Q.copyText=Q.initCopyText),i&&(Object(f.select)(i).classed("tooltip--visible",h),h&&Object(f.select)(i).style("left",a.pageX+"px").style("top",a.pageY-28+"px"),Object(f.select)(o).style("background",b||("true"===d?n.vitalColor?m(n.vitalColor):n.theme.palette.brandDanger:n.trivialColor?m(n.trivialColor):n.theme.palette.brandWarning)).html('\n \n \n "+p+"\n "))},ee=function(e,t,n){var a,r,i,o,l=(null===(a=n.currentTarget)||void 0===a?void 0:a.dataset.labelHeader)+"\n \r\nBar percentage: "+(null===(r=n.currentTarget)||void 0===r?void 0:r.dataset.label)+"\n \r\nCumulative percentage: "+(null===(i=n.currentTarget)||void 0===i?void 0:i.dataset.label2)+"\n \r\nCounts: "+(null===(o=n.currentTarget)||void 0===o?void 0:o.dataset.count)||"No Content",s=document.createElement("textarea");s.innerText=l;var c=e.current?e.current:document.body;c&&c.appendChild(s),s.select(),document.execCommand("copy"),Object(f.select)(c).select(".tooltip-copy-label").text(Q.dataCopied),s.remove()},te=function(e){var t=e.theme,n=e.styles,a=e.padding,r=e.chartId,i=e.chartWidth,o=e.vitalBreakpointVal,s=e.vitalLineColor,c=e.curveLineColor,p=e.p,b=e.xBand,h=e.pathData,m=e.line,x=e.showVitalFew;return u.a.createElement("g",{clipPath:"url(#"+r+")",className:n.paths},u.a.createElement("path",{className:["line--curve",n.line,Object(d.css)(Y||(Y=l(["\n stroke: ",";\n "],["\n stroke: ",";\n "])),c||t.colors.text)].join(" "),transform:"translate("+a+", 0)",ref:function(e){Object(f.select)(e).datum(h).attr("d",m)}}),x&&u.a.createElement("line",{className:["line--horizontal",n.lineCutOff,Object(d.css)(X||(X=l(["\n stroke: ",";\n "],["\n stroke: ",";\n "])),s||t.palette.brandDanger)].join(" "),transform:"translate("+(a+b.bandwidth()/2)+", 0)",ref:function(e){Object(f.select)(e).attr("x1",0).attr("x2",i-a).attr("y1",p(o/100)).attr("y2",p(o/100))}}))},ne=function(e){var t=e.data,n=e.styles,a=e.padding,r=e.chartHeight,o=e.chartWidth,l=(e.x,e.xPBand),s=e.y,c=e.p,d=e.pLabels,p=e.vitalBreakpointVal,b=e.isInclusive,h=!!t.p.filter((function(e){return e100?100:s;var c=((null===(l=e)||void 0===l?void 0:l.p[i-1])?e.p[i-1]:0)+s;c=c>100?100:c;var u=i===t.length-1?Math.trunc(Math.ceil(c))+" %":c.toFixed(2)+" %",d=s.toFixed(2)+" %";return r(r({},e),{x:o(e.x,[a.x]),y:o(e.y,[a.y]),p:o(e.p,[c]),xP:o(e.xP,[s]),xAxisLabels:o(e.xAxisLabels,[u]),tooltipLabel:o(e.tooltipLabel,[d])})}),{x:[],y:[],p:[],xP:[],xAxisLabels:[],tooltipLabel:[]}),this.results):(this.results=null,this.error={message:"Please check your query. There is no data available!"},this.results)},e}();n.d(t,"plugin",(function(){return re}));var re=new a.PanelPlugin((function(e){var t,n=e.options,a=e.data,i=e.width,o=e.height,s=e.id,b=Object(c.useRef)(null),h=Object(p.useTheme)(),m=q();if(!a||!a.series.length)return u.a.createElement("div",{className:["placeholder--no-data",m.placeholder.__noData].join(" ")},"No Data");var x="chartMask_"+s,v=new ae(a).getResults(),g=v.results,y=v.error;if(y||!g)return u.a.createElement("div",{className:["placeholder--no-data",m.placeholder.__noData].join(" ")},(null===(t=y)||void 0===t?void 0:t.message)||"Invalid data");var O=function(e,t){var n=t.options,a=t.width,r=t.height,i=n.vitalBreakpointVal,o=Object(f.max)(e.y)||0,l=Object(f.min)(e.y)||0,s=r-60,c=a-40,u=n.barPadding<1?n.barPadding:n.barPadding/10,d=Object(f.scaleBand)().range([0,c-20]).padding(u),p=Object(f.scaleBand)().range([0,c-20]).padding(u).paddingOuter(.6),b=Object(f.scaleLinear)().range([0,c-20]),h=Object(f.scaleLinear)().range([0,c-20]),m=Object(f.scaleLinear)().range([s,0]),x=Object(f.scaleLinear)().range([s,0]),v=Object(f.line)().curve(f.curveBasis).x((function(e,t){return h(t)||0})).y((function(e){return e?x(e.p/100):e})),g=e.p.map((function(t,n){return{x:e.xAxisLabels[n]||"",p:t||0}}))||null,y=e.p.map((function(t,n){return{x:e.xAxisLabels[n]||"",p:i}}))||null,O=e.p.map((function(e,t){return{x:t,p:0}})),j=e.p[0]/e.p.length,w=l-j>0?l-j:0;return d.domain(e.xAxisLabels),p.domain(e.xAxisLabels),b.domain([-1,e.x.length]),h.domain([-1,e.x.length]),x.domain([0,1]),m.domain([w,o+j]),{padding:20,x:h,xBand:d,xPBand:p,xLinear:b,y:m,p:x,chartHeight:s,chartWidth:c,line:v,pathData:g,cutOffXPathData:y,bottomLineData:O,pLabels:function(e,t){return 0!==t&&e&&e?100*e+" %":""},Component:G}}(g,{options:n,width:i,height:o}),j=r(r(r({data:g,theme:h,styles:m,chartId:x},n),O),{svgRef:b}),w=O.Component;return u.a.createElement("div",{className:Object(d.cx)(m.wrapper,Object(d.css)(K||(K=l(["\n width: ","px;\n height: ","px;\n "],["\n width: ","px;\n height: ","px;\n "])),i,o))},u.a.createElement(Z,r({},j)),u.a.createElement("svg",{ref:b,className:["svg--pareto-chart",m.svg].join(" "),width:i,height:o,xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",viewBox:"0 0 "+i+" "+o},u.a.createElement("g",{transform:"translate("+O.padding+", "+O.padding+")",className:"wrapper"},u.a.createElement(w,r({},j)),u.a.createElement(te,r({},j)),u.a.createElement(ne,r({},j))),u.a.createElement(U,r({},j)),u.a.createElement("defs",null,u.a.createElement("clipPath",{id:x},u.a.createElement("rect",{transform:"translate(0, -"+j.padding+")",ref:function(e){Object(f.select)(e).attr("width",j.chartWidth-j.padding).attr("height",j.chartHeight+j.padding)}})))))})).setPanelOptions((function(e){return e.addBooleanSwitch({path:"showVitalFew",name:"Show vital few line",description:"Indicates that many defects come from relatively few causes.",defaultValue:!0}).addNumberInput({path:"vitalBreakpointVal",name:"Vital few value (%)",description:"Default is 80 based on the 80/20 rule. But, you are able to customize this.",defaultValue:20}).addBooleanSwitch({path:"isInclusive",name:"Inclusive vital few",description:"Include bar with overlapping breakpoint value",defaultValue:!1}).addBooleanSwitch({path:"showBarValue",name:"Show bar values",description:"Show the bar values on top of the bars?",defaultValue:!1}).addBooleanSwitch({path:"showBarText",name:"Show bar labels",description:"Show the bar label?",defaultValue:!1}).addNumberInput({path:"barTextFontSize",name:"Bar label font size",description:"Font size for the bar label.",defaultValue:12}).addNumberInput({path:"barTextRotation",name:"Bar label rotation",description:"Rotation degree of the label",defaultValue:270}).addNumberInput({path:"valToFixed",name:"Number of decimals (max. 6)",description:"Set number of decimals in bar values.",settings:{min:0,max:6},defaultValue:2,showIf:function(e){return e.showBarValue}}).addNumberInput({path:"barPadding",name:"Bar padding",description:"Space between bars. Should be a value between 1 and 9.",defaultValue:2,settings:{min:1,max:9}}).addColorPicker({category:["Colors"],path:"curveLineColor",name:"Percentage line",description:"The curved line visualizing the optimal trade off"}).addColorPicker({category:["Colors"],path:"vitalLineColor",name:"Breakpoint lines",description:"Horizontal and vertical lines indicating the vital few breakpoint",showIf:function(e){return e.showVitalFew}}).addColorPicker({category:["Colors"],path:"vitalColor",name:"Vital few bars",description:"The bars within the determined vital few percentage"}).addColorPicker({category:["Colors"],path:"barLabelColor",name:"Bar label color",description:"Color or the bar label"}).addColorPicker({category:["Colors"],path:"trivialColor",name:"Trivial many bars",description:"The bars outside the vital few percentage"}).addColorPicker({category:["Colors"],path:"barHoverColor",name:"Bar hover state",description:"Bar fill color on hover"})}))}])})); 3 | //# sourceMappingURL=module.js.map -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/module.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! ***************************************************************************** 2 | Copyright (c) Microsoft Corporation. 3 | 4 | Permission to use, copy, modify, and/or distribute this software for any 5 | purpose with or without fee is hereby granted. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 8 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 9 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 10 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 11 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 12 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 13 | PERFORMANCE OF THIS SOFTWARE. 14 | ***************************************************************************** */ 15 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/isaozler-paretochart-panel/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "panel", 3 | "name": "Pareto Chart", 4 | "id": "isaozler-paretochart-panel", 5 | "info": { 6 | "description": "Pareto Chart for Grafana", 7 | "author": { 8 | "name": "Isa Ozler", 9 | "url": "https://isaozler.com", 10 | "email": "contactme@isaozler.com" 11 | }, 12 | "keywords": ["grafana", "pareto", "chart"], 13 | "logos": { 14 | "small": "img/logo.svg", 15 | "large": "img/logo.svg" 16 | }, 17 | "links": [], 18 | "screenshots": [ 19 | { "name": "Pareto Chart Dashboard Impression", "path": "img/production-env--impression.jpg" }, 20 | { "name": "Pareto Chart Edit Dashboard", "path": "img/pareto-chart-edit-panel.jpg" } 21 | ], 22 | "version": "0.3.2", 23 | "updated": "2021-10-18" 24 | }, 25 | "dependencies": { 26 | "grafanaDependency": ">=7.0.0", 27 | "grafanaVersion": "7.x", 28 | "plugins": [] 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/libre-event-editor-panel/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 1.0.0 (Unreleased) 4 | 5 | Initial release. 6 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/libre-event-editor-panel/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 {yyyy} {name of copyright owner} 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 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/libre-event-editor-panel/README.md: -------------------------------------------------------------------------------- 1 | # Libre Event Editor Table Panel 2 | 3 | This panel gives users the ability to list downtime reasons and edit them to assign a reason and comment. Users can also split event to correctly capture downtime information. This panel is part of [Libre](https://github.com/Spruik/Libre). This plugin interfaces to the Libre core GraphQL server. This panel is targeted at Grafana v8.x.x only. 4 | 5 | ![Panel](./docs/ScreenRecording.gif) 6 | 7 | ## Installation 8 | 9 | The easiest way to get started with this plugin is to [download the latest release](https://github.com/Spruik/Libre-Event-Editor-Table-Panel/releases/latest/download/libre-event-editor-table-panel.zip), unzip into grafana plugin directory and restart grafana. 10 | 11 | Download the latest release 12 | 13 | ```shell 14 | $ wget https://github.com/Spruik/Libre-Event-Editor-Table-Panel/releases/latest/download/libre-event-editor-table-panel.zip 15 | Resolving github.com (github.com)... 140.82.114.4 16 | ... 17 | 2020-06-24 20:47:59 (1.08 MB/s) - 'libre-event-editor-table-panel.zip' saved [90150] 18 | ``` 19 | 20 | Unzip into your Grafana plugin directory 21 | 22 | ```shell 23 | $ unzip libre-event-editor-table-panel.zip -d /var/lib/grafana/plugins 24 | Archive: libre-event-editor-table-panel.zip 25 | ... 26 | inflating: /var/lib/grafana/libre-event-editor-table-panel/utils.js.map 27 | ``` 28 | 29 | Restart Grafana 30 | 31 | ```shell 32 | $ service grafana-server restart 33 | * Stopping Grafana Server 34 | * Starting Grafana Server 35 | ``` 36 | 37 | ## Usage 38 | 39 | In order to get the most out of this panel: 40 | 41 | 1. Add dashboard variables for *Site*, *Area* and *Line* from the database. For example: 42 | ``` 43 | | Variable | Definition | 44 | |----------|-----------------------------------------------------------------------------------------------------------------| 45 | | $Site | query{ 46 | queryEquipment(filter:{not:{has:parent},and:{not:{isActive:false}}}){ 47 | __text: name 48 | __value: id 49 | } 50 | } | 51 | | $Area | query{ 52 | getEquipment(id:"$site"){ 53 | children(filter:{not:{isActive:false}}){ 54 | __text: label 55 | __value: id 56 | } 57 | } 58 | } | 59 | | $Line |query{ 60 | getEquipment(id:"$area"){ 61 | children(filter:{not:{isActive:false}}){ 62 | __text: label 63 | __value: id 64 | } 65 | } 66 | } | 67 | ``` 68 | 2. Add the following 4 queries to the panel 69 | 70 | Equipment 71 | ``` graphql 72 | query { 73 | getEquipment(id:"${line}"){ 74 | id 75 | name 76 | } 77 | } 78 | ``` 79 | Events 80 | ```graphql 81 | query{ 82 | getEquipment(id:"${line}"){ 83 | id 84 | label 85 | Events:eventsByField(filter:{filterField:"packMLStatus",filterValue:"Execute",from:"${__from:date:iso}",to:"${__to:date:iso}"}){ 86 | packMLStatus 87 | startDateTime 88 | endDateTime 89 | duration 90 | reasonCategoryCode 91 | reasonCode 92 | reasonText 93 | } 94 | } 95 | } 96 | ``` 97 | Reasons 98 | ```graphql 99 | query{ 100 | getEquipment(id:"$line"){ 101 | id 102 | label 103 | Reasons:reasonListWithOverrides(filter:{not:{has:parent}}){ 104 | id 105 | isActive 106 | class 107 | label 108 | text 109 | parent{id} 110 | standardValue 111 | category{code} 112 | } 113 | } 114 | } 115 | ``` 116 | ReasonsWithParents 117 | ```graphql 118 | query{ 119 | getEquipment(id:"$line"){ 120 | id 121 | label 122 | Reasons:reasonListWithOverrides(filter:{has:parent}){ 123 | id 124 | isActive 125 | class 126 | label 127 | text 128 | parent{id} 129 | standardValue 130 | category{code} 131 | } 132 | } 133 | } 134 | ``` 135 | 136 | 137 | ### Add/Edit Reason 138 | 139 | Click the event in the table, select a category and reason. Type in a comment and click save. 140 | 141 | ### Split Reason 142 | 143 | Click the event in the table, select a category and reason. Type in a comment and click split. Drag the slider to the correct time to split the event. Alternatively use the edit button, type in the desired timestamp and click save. Use the left/right select to choose which side of the split event to apply the currently selected category, reason and comment too. Click save to split the event. 144 | 145 | ## Contributing 146 | 147 | For any issue, there are fundamentally three ways an individual can contribute: 148 | 149 | - By opening the issue for discussion: For instance, if you believe that you have uncovered a bug in, creating a new issue in the [GitHub issue tracker](https://github.com/Spruik/Libre-Event-Editor-Table-Panel/issues) is the way to report it. 150 | - By helping to triage the issue: This can be done either by providing supporting details (a test case that demonstrates a bug), or providing suggestions on how to address the issue. 151 | - By helping to resolve the issue: Typically, this is done either in the form of demonstrating that the issue reported is not a problem after all, or more often, by opening a Pull Request that changes some bit of something in the panel in a concrete and reviewable manner. 152 | 153 | ## Change log 154 | 155 | - 2.0.0 Rebuild in react to suit Grafana v8.x.x 156 | - 1.0.1 Documentation Update 157 | - Fix subtitle & project path 158 | - Remove unused grunt config 159 | 160 | - 1.0.0 Initial Public Release 161 | ## Learn more 162 | 163 | - [Build a panel plugin tutorial](https://grafana.com/tutorials/build-a-panel-plugin) 164 | - [Grafana documentation](https://grafana.com/docs/) 165 | - [Grafana Tutorials](https://grafana.com/tutorials/) - Grafana Tutorials are step-by-step guides that help you make the most of Grafana 166 | - [Grafana UI Library](https://developers.grafana.com/ui) - UI components to help you build interfaces using Grafana Design System 167 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/libre-event-editor-panel/img/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/libre-event-editor-panel/module.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! ***************************************************************************** 2 | Copyright (c) Microsoft Corporation. 3 | 4 | Permission to use, copy, modify, and/or distribute this software for any 5 | purpose with or without fee is hereby granted. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 8 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 9 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 10 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 11 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 12 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 13 | PERFORMANCE OF THIS SOFTWARE. 14 | ***************************************************************************** */ 15 | 16 | /** @license React v16.13.1 17 | * react-is.production.min.js 18 | * 19 | * Copyright (c) Facebook, Inc. and its affiliates. 20 | * 21 | * This source code is licensed under the MIT license found in the 22 | * LICENSE file in the root directory of this source tree. 23 | */ 24 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/libre-event-editor-panel/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/grafana/grafana/master/docs/sources/developers/plugins/plugin.schema.json", 3 | "type": "panel", 4 | "name": "libre-event-editor-table-panel", 5 | "id": "libre-event-editor-table-panel", 6 | "info": { 7 | "description": "Libre Grafana Panel to assign Downtime Event Reasons", 8 | "author": { 9 | "name": "Tom Hollingworth", 10 | "url": "http://www.libremfg.com/" 11 | }, 12 | "keywords": [ 13 | "panel", 14 | "grafana", 15 | "libre", 16 | "manufacturing", 17 | "industry-4", 18 | "industry-40" 19 | ], 20 | "logos": { 21 | "small": "img/logo.svg", 22 | "large": "img/logo.svg" 23 | }, 24 | "links": [ 25 | { 26 | "name": "Website", 27 | "url": "https://github.com/grafana/grafana-starter-panel" 28 | }, 29 | { 30 | "name": "License", 31 | "url": "https://github.com/grafana/grafana-starter-panel/blob/master/LICENSE" 32 | } 33 | ], 34 | "screenshots": [], 35 | "version": "1.0.0", 36 | "updated": "2022-01-18" 37 | }, 38 | "dependencies": { 39 | "grafanaDependency": ">=7.0.0", 40 | "plugins": [] 41 | } 42 | } -------------------------------------------------------------------------------- /Standalone/grafana/plugins/marcusolsson-gantt-panel/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 0.7.5 (2022-01-07) 4 | 5 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.7.4...v0.7.5) 6 | 7 | ### Bug fixes 8 | 9 | - `experiments` is undefined ([#69](https://github.com/marcusolsson/grafana-gantt-panel/issues/69)) (thanks [@prOOrc](https://github.com/pr00rc)!) 10 | 11 | ## 0.7.4 (2021-09-05) 12 | 13 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.7.3...v0.7.4) 14 | 15 | ### Bug fixes 16 | 17 | - Fix Data Links in Grafana 8.0 ([#49](https://github.com/marcusolsson/grafana-gantt-panel/issues/49)) 18 | 19 | ## 0.7.3 (2021-08-06) 20 | 21 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.7.2...v0.7.3) 22 | 23 | ### Bug fixes 24 | 25 | - Cannot read property 'visualization' of undefined ([#38](https://github.com/marcusolsson/grafana-gantt-panel/issues/38)) 26 | 27 | ## 0.7.2 (2021-06-15) 28 | 29 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.7.1...v0.7.2) 30 | 31 | ### Enhancements 32 | 33 | - Upgrade grafana-plugin-support dependency 34 | 35 | ## 0.7.1 (2021-06-15) 36 | 37 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.7.0...v0.7.1) 38 | 39 | ### Enhancements 40 | 41 | - Nothing plotted when too many values on y axis ([#32](https://github.com/marcusolsson/grafana-gantt-panel/issues/32)) 42 | - Metadata and docs updates 43 | - Upgrade dependencies 44 | 45 | ## 0.7.0 (2021-05-09) 46 | 47 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.6.1...v0.7.0) 48 | 49 | ### Enhancements 50 | 51 | - Color support: You can now configure colors based on text and number fields. Unfortunately, **this bumps the minimum required Grafana version to 7.3.0** ([#26](https://github.com/marcusolsson/grafana-gantt-panel/pull/26)) 52 | - Support for data links ([#25](https://github.com/marcusolsson/grafana-gantt-panel/issues/25)) 53 | - Improved zoom support 54 | - Option to not display y axis labels ([#30](https://github.com/marcusolsson/grafana-gantt-panel/issues/30)) 55 | - Limit task bar height ([#22](https://github.com/marcusolsson/grafana-gantt-panel/pull/22)) (thanks @ymmt07039) 56 | 57 | ## 0.6.1 (2021-03-07) 58 | 59 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.6.0...v0.6.1) 60 | 61 | ### Enhancements 62 | 63 | - Limit Y-axis to relevant values only ([#19](https://github.com/marcusolsson/grafana-gantt-panel/issues/19)) 64 | 65 | ## 0.6.0 (2021-02-18) 66 | 67 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.5.0...v0.6.0) 68 | 69 | ### Enhancements 70 | 71 | Adds a new Experiments category with two new features: _Lock to extents_ and _Relative time_: 72 | 73 | - **Lock to extents** locks the zoom to fit all tasks from start to finish 74 | - **Relative time** changes the X axis to display the duration from when the first task started 75 | 76 | ## 0.5.0 (2021-02-16) 77 | 78 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.4.0...v0.5.0) 79 | 80 | ### Enhancements 81 | 82 | - Add option to sort tasks by text or by start time ([#15](https://github.com/marcusolsson/grafana-gantt-panel/issues/15)) 83 | - Make dimensions clearable ([#12](https://github.com/marcusolsson/grafana-gantt-panel/issues/12)) 84 | - Add fallback panel for unsupported Grafana versions 85 | - Add wizard for configuring the query 86 | 87 | ## 0.4.0 (2021-02-06) 88 | 89 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.3.1...v0.4.0) 90 | 91 | ### Enhancements 92 | 93 | - Add labels to tooltip ([#9](https://github.com/marcusolsson/grafana-gantt-panel/issues/9)) 94 | - Click-and-drag to change dashboard time interval ([#10](https://github.com/marcusolsson/grafana-gantt-panel/issues/10)) 95 | 96 | ## 0.3.1 (2021-02-02) 97 | 98 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.3.0...v0.3.1) 99 | 100 | ### Bug fixes 101 | 102 | - Reduced precision when using strings as time ([#5](https://github.com/marcusolsson/grafana-gantt-panel/issues/5)) 103 | 104 | ## 0.3.0 (2021-01-28) 105 | 106 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.2.0...v0.3.0) 107 | 108 | ### Enhancements 109 | 110 | - Null values are interpreted as infinity 111 | - Add duration to tooltip 112 | - Improved styles 113 | 114 | ## 0.2.0 (2020-01-27) 115 | 116 | [Full changelog](https://github.com/marcusolsson/grafana-gantt-panel/compare/v0.1.0...v0.2.0) 117 | 118 | ### Enhancements 119 | 120 | - Allow using string and number fields as time ([#1](https://github.com/marcusolsson/grafana-gantt-panel/issues/1), [#2](https://github.com/marcusolsson/grafana-gantt-panel/issues/2)) 121 | 122 | ## 0.1.0 (2020-01-08) 123 | 124 | Initial release. Not fit for production use. 125 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/marcusolsson-gantt-panel/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 2022 Marcus Olsson 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 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/marcusolsson-gantt-panel/MANIFEST.txt: -------------------------------------------------------------------------------- 1 | 2 | -----BEGIN PGP SIGNED MESSAGE----- 3 | Hash: SHA512 4 | 5 | { 6 | "manifestVersion": "2.0.0", 7 | "signatureType": "community", 8 | "signedByOrg": "marcusolsson", 9 | "signedByOrgName": "Marcus Olsson", 10 | "plugin": "marcusolsson-gantt-panel", 11 | "version": "0.7.5", 12 | "time": 1641552991497, 13 | "keyId": "7e4d0c6a708866e7", 14 | "files": { 15 | "CHANGELOG.md": "bbc5ce985c5fd5d23af9a35675543e8fc43b408796b6ecca409e16c368f4333c", 16 | "module.js.map": "330647eae34cd9e6b993fecaf4cc8316757f8bf84e839e289c7b21e02ce07f14", 17 | "module.js": "4fa4e704d6e2621785cd4ded595f3f50f20399cb2524134c550480ff10da7d89", 18 | "img/light.png": "fcb10b8798a4f3b60b064d9e6eaf64e1221d1f161de985e73ce78d3802b24a36", 19 | "img/dark.png": "a99b6f7e1cdc1cf8a5b1d5558bed4ee9b2998063b2c0d8932bf76b20241fead4", 20 | "img/logo.svg": "360d6e805c3d99714c01ee23efbdbb84bd9c279471acec4d5bed0901a8488e22", 21 | "LICENSE": "5ab170e6de9123e3d011f1cd05e8dc2586954c1e889aac499bf5d98dc83e2839", 22 | "plugin.json": "447f276abdbd40e83609a4ec15e290321b61dda1033b3a3dfda8b773fce1a21e", 23 | "README.md": "0e03eee69e33703ac62e4ea70ad587231ea3dc05dea461f2123bb679af446f41" 24 | } 25 | } 26 | -----BEGIN PGP SIGNATURE----- 27 | Version: OpenPGP.js v4.10.1 28 | Comment: https://openpgpjs.org 29 | 30 | wqAEARMKAAYFAmHYHF8ACgkQfk0ManCIZue3hAIIr8ZSCXvCRkETaM6z8rCw 31 | K2RGcAiE3DGGKSEc4h40OTlPa+fNi6OwIgoLzEJdvYsGSiSJKpGfHvcuceUC 32 | nk8FxxsCBjjfXa5RSzsk9LbVgEE1oozrnEjMzbrU6LUn6LMpb3jvHivfeHhf 33 | K6tPQ0kiehTwPvD5xoIG2xMGTd+tQMnf+Ydq 34 | =TDaD 35 | -----END PGP SIGNATURE----- 36 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/marcusolsson-gantt-panel/README.md: -------------------------------------------------------------------------------- 1 | # Gantt for Grafana 2 | 3 | [![Build](https://github.com/marcusolsson/grafana-gantt-panel/workflows/CI/badge.svg)](https://github.com/marcusolsson/grafana-gantt-panel/actions?query=workflow%3A%22CI%22) 4 | [![Release](https://github.com/marcusolsson/grafana-gantt-panel/workflows/Release/badge.svg)](https://github.com/marcusolsson/grafana-gantt-panel/actions?query=workflow%3ARelease) 5 | [![Marketplace](https://img.shields.io/badge/dynamic/json?logo=grafana&color=F47A20&label=marketplace&prefix=v&query=%24.items%5B%3F%28%40.slug%20%3D%3D%20%22marcusolsson-gantt-panel%22%29%5D.version&url=https%3A%2F%2Fgrafana.com%2Fapi%2Fplugins)](https://grafana.com/grafana/plugins/marcusolsson-gantt-panel) 6 | [![Downloads](https://img.shields.io/badge/dynamic/json?logo=grafana&color=F47A20&label=downloads&query=%24.items%5B%3F%28%40.slug%20%3D%3D%20%22marcusolsson-gantt-panel%22%29%5D.downloads&url=https%3A%2F%2Fgrafana.com%2Fapi%2Fplugins)](https://grafana.com/grafana/plugins/marcusolsson-gantt-panel) 7 | [![License](https://img.shields.io/github/license/marcusolsson/grafana-gantt-panel)](LICENSE) 8 | [![Twitter](https://img.shields.io/twitter/follow/marcusolsson?color=%231DA1F2&label=twitter&style=plastic)](https://twitter.com/marcusolsson) 9 | 10 | A panel plugin for [Grafana](https://grafana.com) to visualize Gantt charts. 11 | 12 | Gantt charts display a list of _tasks over time_, where each task is visualized using a bar with a start and an end time. 13 | 14 | ## Features 15 | 16 | - Identify bottlenecks where one or more tasks are running significantly longer than others 17 | - Compare recurring sets of tasks by grouping them, such as data pipelines that run in regular intervals. 18 | - Display additional metadata from your data source as labels 19 | 20 | ![Screenshot](https://github.com/marcusolsson/grafana-gantt-panel/raw/main/src/img/dark.png) 21 | 22 | ## Configuration 23 | 24 | This section lists the available configuration options for the Gantt panel. 25 | 26 | ### Panel options 27 | 28 | #### Experiments 29 | 30 | By enabling experiments, you can try out new features that we're working on. **Experiments can be unstable and may break your panel**. Use at your own risk. 31 | 32 | #### Dimensions 33 | 34 | | Option | Description | 35 | |--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 36 | | _Text_ | Name of the field to use for task labels. Defaults to the first string field. | 37 | | _Start time_ | Name of the field to use for value. Defaults to the first time field. | 38 | | _End time_ | Name of the field to use for value. Defaults to the second time field. | 39 | | _Color by_ | Field to use for colors. Defaults to the text field. Color configuration depends on the field type. If the dimension is set to a string field, you can add _color mappings_ for each value. If the dimension is set to a number field, you can instead use field options to configure the colors. | 40 | | _Group by_ | Name of the field to use to group tasks. When grouping tasks, the time interval is set to the start of the first task and the end of the last task in the group. | 41 | | _Labels_ | Fields to use as labels in the tooltip. | 42 | 43 | As some data sources don't yet support time fields, the plugin supports selecting string and number fields as start and end time: 44 | 45 | - If you select a string field, values need to be ISO 8601 strings 46 | - If you select a number field, values need to be Unix timestamps in milliseconds 47 | 48 | #### Display 49 | 50 | | Option | Description | 51 | |------------------|------------------------------------------------------------------------------------| 52 | | _Show Y-axis_ | Toggles the Y-axis. | 53 | | _Sort by_ | Dimension to sort tasks by. | 54 | | _Sort order_ | Order in which to sort the tasks. | 55 | | _Color mappings_ | Configures task color based on the text value based on the **Color by** dimension. | 56 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/marcusolsson-gantt-panel/img/dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/grafana/plugins/marcusolsson-gantt-panel/img/dark.png -------------------------------------------------------------------------------- /Standalone/grafana/plugins/marcusolsson-gantt-panel/img/light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/grafana/plugins/marcusolsson-gantt-panel/img/light.png -------------------------------------------------------------------------------- /Standalone/grafana/plugins/marcusolsson-gantt-panel/img/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/marcusolsson-gantt-panel/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/grafana/grafana/raw/main/docs/sources/developers/plugins/plugin.schema.json", 3 | "type": "panel", 4 | "name": "Gantt", 5 | "id": "marcusolsson-gantt-panel", 6 | "info": { 7 | "description": "Tasks and processes over time", 8 | "author": { 9 | "name": "Marcus Olsson" 10 | }, 11 | "keywords": ["panel", "gantt"], 12 | "logos": { 13 | "small": "img/logo.svg", 14 | "large": "img/logo.svg" 15 | }, 16 | "links": [ 17 | { "name": "Website", "url": "https://github.com/marcusolsson/grafana-gantt-panel" }, 18 | { "name": "License", "url": "https://github.com/marcusolsson/grafana-gantt-panel/blob/main/LICENSE" } 19 | ], 20 | "screenshots": [ 21 | { "name": "Gantt (Dark)", "path": "img/dark.png" }, 22 | { "name": "Gantt (Light)", "path": "img/light.png" } 23 | ], 24 | "version": "0.7.5", 25 | "updated": "2022-01-07" 26 | }, 27 | 28 | "dependencies": { 29 | "grafanaDependency": ">=7.3.0", 30 | "grafanaVersion": "7.3.0", 31 | "plugins": [] 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## v1.6.0 6 | 7 | Adding Multi-bar support 8 | 9 | ## v1.6.1 10 | 11 | Signed, as required by Grafana 7.x.x. No other changes 12 | 13 | ## v1.7.0 14 | 15 | Adding label and group reformatting rules, plus optional reformat-in-place for date/time field. 16 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/MANIFEST.txt: -------------------------------------------------------------------------------- 1 | 2 | -----BEGIN PGP SIGNED MESSAGE----- 3 | Hash: SHA512 4 | 5 | { 6 | "manifestVersion": "2.0.0", 7 | "signatureType": "community", 8 | "signedByOrg": "michaeldmoore", 9 | "signedByOrgName": "michaeldmoore", 10 | "plugin": "michaeldmoore-multistat-panel", 11 | "version": "1.7.2", 12 | "time": 1619000406798, 13 | "keyId": "7e4d0c6a708866e7", 14 | "files": { 15 | "module.js": "7a5f3a8963055bade122b529e257a609c16f658ed1323aba571bcff7c067516a", 16 | "layout.html": "3a9387a752f8ef9cc90d67754c2d864ae466e2ad0b094fdf42b1673835891cc6", 17 | "img/Showcase.gif": "21d41346060757cdf72bbacfb69a6e0f19df71cd3865e9e2e92a57c637da03be", 18 | "img/michaeldmoore-multistat-panel.svg": "c38ae1188adf61615267773940547de3ad819534b8c8a0789ddf660674c258aa", 19 | "grouping.html": "54fe93f6bfb5ed76eebe601d61cf838e14011858994401e74decbad0c36ee342", 20 | "module.js.map": "65e106432995c3f01e9d78cd4a847ce71fa018359cec5016697ed34d21bc2aaf", 21 | "plugin.json": "c7cc007dce0e550110dbcccb14eb2e21999d0a0af3260c540264aaef1de7017d", 22 | "README.md": "30b299bfa7957b8816fab76efe7203cf9edcc19463b4c638465d76f4eb24cd60", 23 | "module.html": "cd9dbc8949fd1941f80005892e3d22da22b4fa4e56a2e8da2091e3f4acee3a3f", 24 | "options.html": "b1b9dd3bcbc7b64a03a25695cbaba568e170ab3ef61fafdf2830162ef50afb04", 25 | "columns.html": "fb0a6a9027f7d954f90c068df3774f321712c0af6a93904bf236794a91cfd93f", 26 | "barlinks.html": "d6ee971a5d41cd7a3c7e7bef79998a55af8744da093fdf14a6c28454f14af241", 27 | "CHANGELOG.md": "81ba8ce20a5d95465fcdbdb7cdeb981ad2b0664fd79c6dce0eeae348ce3dd585", 28 | "css/multistat-panel.css": "34f4d96627d86e779276e368e437be3eab21ae75004dafcd75659391052b4baa", 29 | "linesandlimits.html": "f2ee12bdfe3175f84de1ba314644b8cafa0e24a383985f760e9c6198b4efa260" 30 | } 31 | } 32 | -----BEGIN PGP SIGNATURE----- 33 | Version: OpenPGP.js v4.10.1 34 | Comment: https://openpgpjs.org 35 | 36 | wqIEARMKAAYFAmB//FcACgkQfk0ManCIZucEOgIJAYL+Pdb9IttDuX/rCi94 37 | MNDcOeydEBQedIqvq8pBZUO6frzZNEfmgLySl8+CIWKWAG92+lIwKILECus2 38 | h1M6+jj+AgkBWv9+kCXqGOOJa5c26aFGocCXYyJg+w6bHqiWzUnBZVVPvsQH 39 | 3FOUCnSIWugU63VNjgT7VlC25awDLSUpgFKk1q4= 40 | =qugQ 41 | -----END PGP SIGNATURE----- 42 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/barlinks.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 20 | 21 | 23 |
24 |
25 |
26 |
27 |
28 | 29 | 30 | 32 |
33 |
34 |
35 |
36 | 37 |
38 | 42 |
43 |
44 |
-------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/columns.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 | 9 |
10 |
11 |
12 | 13 |
14 | 15 | 19 |
20 | 21 |
22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 38 | 39 | 40 | 41 | 43 |
44 |
45 | 46 |
47 | 48 | 51 |
52 |
53 |
54 | 55 | 57 | 58 | 60 | 61 |
62 | 64 |
65 |
66 |
67 | 68 |
69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 |
77 | 78 | 81 |
82 |
83 |
84 | 85 |
86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 |
98 | 100 |
101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 112 |
113 | 114 |
115 |
116 | 117 |
118 | 120 |
121 |
122 |
123 |
124 |
125 | 126 |
127 | 129 |
130 |
131 |
132 | 133 | 136 | 138 |
139 |
140 |
141 |
142 |
143 | 144 | 147 | 153 |
154 |
155 |
156 |
157 |
As-Of Date display:
158 | This option controls if, and how the latest query time is displayed in the top right hand side of the panel.
159 | Depending on the data source and query, each row in Multistat may be updated at different times.
160 | This display can be useful in showing the latest timestamp of all the data displayed in the panel - as a snapshot date/time.
161 | 
162 | Date display formatting string uses common standards. (see here)
163 | 
164 | Setting the format string to the reserved keyword "ELAPSED" displays the time as the elapsed time since the last data update (as per the latest grafana refresh operation).
165 |    	  
166 |
167 |
168 |
169 | 170 |
171 | 173 |
174 |
175 | 177 |
178 |
179 |
180 |
181 |
182 | 186 |
187 | 189 |
190 |
191 |
192 | 193 |
194 | 195 | 199 |
200 | 201 |
203 |
204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 219 | 220 |
221 | 223 |
224 | 225 | 226 | 227 | 228 |
229 |
230 | 231 |
232 | 237 |
238 |
239 |
-------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/css/multistat-panel.css: -------------------------------------------------------------------------------- 1 | .michaeldmoore-multistat-panel-nodata { 2 | position: absolute; 3 | top: 50%; 4 | text-align: center; 5 | vertical-align: middle; 6 | font-size: 0.875rem; 7 | } 8 | 9 | .michaeldmoore-multistat-panel-maxDate { 10 | margin-right: 4em; 11 | float: right; 12 | padding-left: 20px; 13 | } 14 | 15 | .michaeldmoore-multistat-panel-dark-tooltip { 16 | position: absolute; 17 | width: auto; 18 | height: auto; 19 | padding: 5px; 20 | background-color: black; 21 | color: white; 22 | -webkit-border-radius: 10px; 23 | -moz-border-radius: 10px; 24 | border-radius: 10px; 25 | -webkit-box-shadow: 4px 4px 10px rgba(255, 255, 255, 0.4); 26 | -moz-box-shadow: 4px 4px 10px rgba(255, 255, 255, 0.4); 27 | box-shadow: 4px 4px 10px rgba(255, 255, 255, 0.4); 28 | } 29 | 30 | .michaeldmoore-multistat-panel-dark-tooltip th { 31 | font-weight: bold; 32 | text-align: center; 33 | border-bottom: 1px solid white; 34 | } 35 | 36 | .michaeldmoore-multistat-panel-dark-tooltip td:first-of-type { 37 | padding-right: 1em; 38 | } 39 | 40 | .michaeldmoore-multistat-panel-dark-tooltip a { 41 | color: #8080ff; 42 | text-decoration: blue underline; 43 | } 44 | 45 | .michaeldmoore-multistat-panel-light-tooltip { 46 | position: absolute; 47 | width: auto; 48 | height: auto; 49 | padding: 5px; 50 | background-color: white; 51 | color: black; 52 | -webkit-border-radius: 10px; 53 | -moz-border-radius: 10px; 54 | border-radius: 10px; 55 | -webkit-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4); 56 | -moz-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4); 57 | box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.4); 58 | } 59 | 60 | .michaeldmoore-multistat-panel-light-tooltip th { 61 | font-weight: bold; 62 | text-align: center; 63 | border-bottom: 1px solid black; 64 | } 65 | 66 | .michaeldmoore-multistat-panel-light-tooltip td:first-of-type { 67 | padding-right: 1em; 68 | } 69 | 70 | .michaeldmoore-multistat-panel-light-tooltip a { 71 | color: #8080ff; 72 | text-decoration: blue underline; 73 | } 74 | 75 | 76 | 77 | 78 | 79 | .michaeldmoore-multistat-panel-statusmessage { 80 | position: absolute; 81 | top: 50%; 82 | left: 50%; 83 | margin-right: -50%; 84 | transform: translate(-50%, -50%); 85 | } 86 | 87 | 88 | .michaeldmoore-multistat-panel-w2 { 89 | width: 1.75rem; 90 | height: 37px; 91 | margin-right: 0.25rem; 92 | margin-bottom: 0px; 93 | } 94 | 95 | .michaeldmoore-multistat-panel-w3 { 96 | width: 2.75rem; 97 | height: 37px; 98 | margin-right: 0.25rem; 99 | margin-bottom: 0px; 100 | } 101 | 102 | .michaeldmoore-multistat-panel-w4 { 103 | width: 3.75rem; 104 | height: 37px; 105 | margin-right: 0.25rem; 106 | margin-bottom: 0px; 107 | } 108 | 109 | .michaeldmoore-multistat-panel-w5 { 110 | width: 4.75rem; 111 | height: 37px; 112 | margin-right: 0.25rem; 113 | margin-bottom: 0px; 114 | } 115 | 116 | .michaeldmoore-multistat-panel-w6 { 117 | width: 5.75rem; 118 | height: 37px; 119 | margin-right: 0.25rem; 120 | margin-bottom: 0px; 121 | } 122 | 123 | .michaeldmoore-multistat-panel-w7 { 124 | width: 6.75rem; 125 | height: 37px; 126 | margin-right: 0.25rem; 127 | margin-bottom: 0px; 128 | } 129 | 130 | .michaeldmoore-multistat-panel-w8 { 131 | width: 7.75rem; 132 | height: 37px; 133 | margin-right: 0.25rem; 134 | margin-bottom: 0px; 135 | } 136 | 137 | .michaeldmoore-multistat-panel-w9 { 138 | width: 8.75rem; 139 | height: 37px; 140 | margin-right: 0.25rem; 141 | margin-bottom: 0px; 142 | } 143 | 144 | .michaeldmoore-multistat-panel-w10 { 145 | width: 9.75rem; 146 | height: 37px; 147 | margin-right: 0.25rem; 148 | margin-bottom: 0px; 149 | } 150 | 151 | .michaeldmoore-multistat-panel-w16 { 152 | width: 15.75rem; 153 | height: 37px; 154 | margin-right: 0.25rem; 155 | margin-bottom: 0px; 156 | } 157 | 158 | .michaeldmoore-multistat-panel-w18 { 159 | width: 17.75rem; 160 | height: 37px; 161 | margin-right: 0.25rem; 162 | margin-bottom: 0px; 163 | } 164 | 165 | .michaeldmoore-multistat-panel-w25 { 166 | width: 24.75rem; 167 | height: 37px; 168 | margin-right: 0.25rem; 169 | margin-bottom: 0px; 170 | } 171 | 172 | pre a { 173 | display: contents; 174 | text-decoration: underline; 175 | } 176 | 177 | .michaeldmoore-multistat-panel-legend { 178 | flex-grow: 1; 179 | margin-left: 50px; 180 | } 181 | 182 | .michaeldmoore-multistat-panel-legend li { 183 | display: inline; 184 | padding: 5px 50px 5px 5px; 185 | margin-right: 20px; 186 | } 187 | 188 | .michaeldmoore-multistat-panel-legend-deselected { 189 | color:darkgray !important; 190 | background-color: lightgray !important; 191 | } 192 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/grouping.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 | 9 |
10 |
11 |
12 |
13 | 14 | 17 |
18 | 19 | 22 | 23 | 26 |
27 |
28 | 29 |
30 | 31 | 35 |
36 | 37 |
38 |
39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 54 | 55 | 56 | 57 | 59 |
60 |
61 | 62 |
63 | 64 | 67 |
68 |
69 | 70 | 73 |
74 |
75 | 77 |
78 | 79 |
80 | 82 |
83 | 84 | 85 | 86 | 87 |
88 |
89 |
90 | 92 |
93 |
94 |
-------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/img/Showcase.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/grafana/plugins/michaeldmoore-multistat-panel/img/Showcase.gif -------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/img/michaeldmoore-multistat-panel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | background 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/layout.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 6 | 8 |
9 | 10 |
11 | 12 | 14 | 15 | 17 |
18 | 19 |
20 | 21 | 23 | 24 | 25 | 26 | 27 | 28 | 30 |
31 | 32 |
33 | 34 | 36 | 37 | 38 | 39 | 40 | 41 | 43 |
44 | 45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 |
59 | 60 |
61 | 62 | 65 |
66 |
67 |
-------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/linesandlimits.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 7 | 9 | 10 | 11 | 12 |
13 | 14 | 16 |
17 |
18 |
19 | 20 | 22 | 24 | 25 | 26 | 27 |
28 | 29 | 31 |
32 |
33 |
34 | 35 | 37 | 39 | 40 | 41 | 42 |
43 | 44 | 46 |
47 |
48 |
49 | 51 |
52 |
53 | 54 | 56 | 58 | 59 | 60 | 61 |
62 | 63 | 65 |
66 |
67 |
68 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 |
78 | 80 |
81 |
82 | 83 | 84 | 85 |
86 | 87 |
88 |
89 | 92 |
93 |
94 |
95 |
96 | 97 | 99 | 101 | 102 | 103 | 104 |
105 | 106 | 108 |
109 |
110 |
111 | 113 | 114 | 115 | 116 | 117 | 118 |
119 | 121 |
122 |
123 | 124 | 125 | 126 |
127 | 128 |
129 |
130 | 133 |
134 |
135 |
136 |
137 | 139 |
140 | 142 |
143 |
144 |
145 | 146 | 148 | 149 | 150 | 151 | 152 | 154 | 155 | 156 | 157 |
158 |
159 |
-------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/module.html: -------------------------------------------------------------------------------- 1 |
2 |
-------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/options.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 6 |
7 | 8 |
9 | 11 |
12 | 13 | 14 | 15 | 16 | 17 |
18 | 20 |
21 |
22 |
23 |
24 | 26 |
27 | 28 |
29 | 31 |
32 | 33 | 34 | 35 | 36 |
37 |
38 |
39 | 41 |
42 | 43 |
44 | 46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
56 |
57 |
58 | 59 | 61 | 62 | 64 |
65 |
66 | 67 | 69 | 70 | 72 |
73 |
74 | 75 | 76 |
77 | 79 |
80 | 81 | 82 |
83 | 85 |
86 |
87 |
88 | 89 | 90 |
91 | 92 | 95 |
96 |
97 |
98 |
-------------------------------------------------------------------------------- /Standalone/grafana/plugins/michaeldmoore-multistat-panel/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "panel", 3 | "name": "Multistat", 4 | "id": "michaeldmoore-multistat-panel", 5 | "info": { 6 | "description": "Enhanced version of built-in SingleStat panel, for queries involving multi-valued recordsets", 7 | "author": { 8 | "name": "Michael Moore", 9 | "url": "https://github.com/michaeldmoore" 10 | }, 11 | "keywords": [ 12 | "multistat", 13 | "singlestat", 14 | "panel" 15 | ], 16 | "version": "1.7.2", 17 | "updated": "2021-04-21", 18 | "logos": { 19 | "small": "img/michaeldmoore-multistat-panel.svg", 20 | "large": "img/michaeldmoore-multistat-panel.svg" 21 | }, 22 | "links": [ 23 | { 24 | "name": "Project site", 25 | "url": "https://github.com/michaeldmoore/michaeldmoore-multistat-panel" 26 | }, 27 | { 28 | "name": "MIT License", 29 | "url": "https://github.com/michaeldmoore/michaeldmoore-multistat-panel/LICENSE" 30 | } 31 | ], 32 | "screenshots": [ 33 | { 34 | "name": "Showcase", 35 | "path": "img/Showcase.gif" 36 | } 37 | ] 38 | }, 39 | "dependencies": { 40 | "grafanaDependency": ">=7.3.0", 41 | "grafanaVersion": "7.3.x", 42 | "plugins": [] 43 | } 44 | } -------------------------------------------------------------------------------- /Standalone/grafana/provisioning/dashboards/dashboards.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | # an unique provider name. Required 5 | - name: 'Libre Dashboards' 6 | # Org id. Default to 1 7 | orgId: 1 8 | # name of the dashboard folder. 9 | folder: 'Libre' 10 | # folder UID. will be automatically generated if not specified 11 | folderUid: '' 12 | # provider type. Default to 'file' 13 | type: file 14 | # disable dashboard deletion 15 | disableDeletion: false 16 | # how often Grafana will scan for changed dashboards 17 | updateIntervalSeconds: 10 18 | # allow updating provisioned dashboards from the UI 19 | allowUiUpdates: false 20 | options: 21 | # path to dashboard files on disk. Required when using the 'file' type 22 | path: /var/lib/grafana/dashboards 23 | # use folder names from filesystem to create folders in Grafana 24 | foldersFromFilesStructure: true -------------------------------------------------------------------------------- /Standalone/grafana/provisioning/datasources/datasources.yaml: -------------------------------------------------------------------------------- 1 | # # config file version 2 | apiVersion: 1 3 | 4 | datasources: 5 | - name: Historian 6 | type: influxdb 7 | typeLogoUrl: public/app/plugins/datasource/influxdb/img/influxdb_logo.svg 8 | access: proxy 9 | url: http://influxdb:8086 10 | basicAuth: true 11 | isDefault: false 12 | readOnly: false 13 | editable: true 14 | secureJsonData: 15 | token: mytokenmytokenmytoken 16 | jsonData: 17 | defaultBucket: Libre 18 | organization: Libre 19 | httpMode: POST 20 | version: Flux 21 | tlsSkipVerify: true 22 | - name: MKG 23 | type: fifemon-graphql-datasource 24 | typeName: GraphQL Data Source 25 | typeLogoUrl: public/plugins/fifemon-graphql-datasource/img/logo.svg 26 | access: proxy 27 | url: http://libre-gateway:4000/graphql 28 | password: 29 | user: 30 | database: 31 | basicAuth: false 32 | isDefault: true 33 | jsonData: 34 | oauthPassThru: true 35 | readOnly: false 36 | editable: true 37 | - name: MQTT 38 | type: grafana-mqtt-datasource 39 | typeName: MQTT 40 | typeLogoUrl: public/plugins/grafana-mqtt-datasource/img/mqtt.svg 41 | access: proxy 42 | secureJsonData: 43 | password: public 44 | jsonData: 45 | host: mqtt 46 | port: 1883 47 | username: admin 48 | readOnly: false 49 | editable: true 50 | -------------------------------------------------------------------------------- /Standalone/graphql-pubsub/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "libreLogger" : { 3 | "defaultLevel": "DEBUG", 4 | "defaultDestination": "CONSOLE", 5 | "loggers": [ 6 | {"MAIN": {"topic":"MAIN"}}, 7 | {"SERVER": {"topic":"SERVER"}}, 8 | {"EdgeService": {"topic":"EDGESVC"}}, 9 | {"PlcConnectorMQTT" : {"topic": "PLCMQTT"}}, 10 | {"graphQLTrans" : {"topic": "GQLTRANS"}}, 11 | {"edge-daemon": {"topic":"EDGEDMON"}}, 12 | {"SubscriptionHandler": {"topic":"SUBHANDLR"}}, 13 | {"RESTAPI": {"topic":"RESTAPI"}}, 14 | 15 | {"DEFAULT": {"topic": "DEFAULT"}} 16 | ] 17 | }, 18 | "libreDataStoreGraphQL" : { 19 | "GRAPHQL_URL": "http://alpha:8080/graphql" 20 | }, 21 | "pubSubConnectorMQTT" : { 22 | "MQTT_SERVER": "mqtt://mqtt:1883", 23 | "MQTT_USER": "admin", 24 | "MQTT_PWD": "public", 25 | "MQTT_SVC_NAME": "GraphqlPubSub" 26 | }, 27 | "GraphQLSubscriber": { 28 | "GRAPHQL_URL": "http://alpha:8080/graphql" 29 | }, 30 | "SubscriptionHandler" : { 31 | "SUBSCRIPTIONS" : [ 32 | { 33 | "TOPIC" : "Libre/subscriptions/workflowSpecification", 34 | "QUERY": "subscription{\n queryWorkflowSpecification{\n id\n isActive\n name\n nodes{\n id\n uiComponent\n form{\n name\n }\n isActive\n name\n description\n nodeType{\n id\n name\n nodeClass\n}\n properties{\n id\n name\n dataType\n }\n inflows {\n from{id,isActive}\n }\n outflows{\n to{id,isActive}\n condition\n }\n }\n }\n}", 35 | "SPLIT": "false" 36 | }, 37 | { 38 | "TOPIC" : "Libre/subscriptions/workflow/maintenance", 39 | "QUERY": "subscription{\n queryWorkflowInstance(filter:{not:{status:{eq:COMPLETED}}})@cascade(fields:\"nodeInstances\"){\n id\n status\n workflowSpecification{id,name}\n nodeInstances(filter:{not:{status:{eq:COMPLETED}}})@cascade(fields:\"node\"){\n id\n status\n node @cascade(fields:\"role\"){\n id\n \tname\n form{name}\n uiComponent\n role(filter:{name:{eq:\"Maintenance\"}}){\n name\n }\n }\n }\n }\n}", 40 | "SPLIT": "false" 41 | }, 42 | { 43 | "TOPIC" : "Libre/subscriptions/workflow", 44 | "QUERY": "subscription{\n queryWorkflowInstance(filter:{not:{status:{eq:COMPLETED}}}){\n id\n status\n workflowSpecification{id,name}\n nodeInstances(filter:{not:{status:{eq:COMPLETED}}}){\n id\n status\n node{\n id\n \tname\n form{name}\n uiComponent\n role{\n name\n }\n }\n }\n }\n}", 45 | "SPLIT": "false" 46 | }, 47 | { 48 | "TOPIC": "Libre/subscriptions/activeTasks", 49 | "QUERY": "subscription{\n queryWorkflowNodeInstance(filter:{not:{status:{eq:COMPLETED}}}){\n id\n status\n workflowInstance {\n id\n __typename\n }\n node {\n id\n name\n uiComponent\n role{\n name\n __typename\n }\n form {\n id\n name\n jsonSchema\n uiSchema\n __typename\n }\n workflowSpecification {\n id\n name\n __typename\n }\n __typename\n }\n }\n}", 50 | "SPLIT": "false" 51 | }, 52 | { 53 | "TOPIC": "Libre/subscriptions/activeTasks/Maintenance", 54 | "QUERY": "subscription{\n queryWorkflowNodeInstance(filter:{not:{status:{eq:COMPLETED}}})@cascade(fields:\"node\"){\n id\n status\n workflowInstance {\n id\n __typename\n }\n node @cascade(fields:\"role\"){\n id\n name\n uiComponent\n role(filter:{name:{eq:\"Maintenance\"}}){\n name\n __typename\n }\n form {\n id\n name\n jsonSchema\n uiSchema\n __typename\n }\n workflowSpecification {\n id\n name\n __typename\n }\n __typename\n }\n }\n}", 55 | "SPLIT": "false" 56 | }, 57 | { 58 | "TOPIC": "Libre/subscriptions/activeWorkflowInstances/equipment", 59 | "QUERY": "subscription{\n queryEquipment{\n id\n workflowInstances(filter:{not:{status:{eq:COMPLETED}}}){\n id\n workflowSpecification{name}\n status\n nodeInstances(filter:{not:{status:{eq:COMPLETED}}}){\n id\n status\n node{\n id\n name\n uiComponent\n form{\n name\n jsonSchema\n uiSchema\n }\n }\n events(order:{desc:createdDateTime} first:1){createdDateTime}\n }\n propertyInstances{\n workflowProperty{name}\n values(order:{desc:createdDateTime} first:1){value}\n }\n }\n }\n}", 60 | "SPLIT": "true" 61 | }, 62 | { 63 | "TOPIC": "Libre/subscriptions/propertyNameAliases/equipment", 64 | "QUERY": "subscription{\n queryEquipment{\n id\n propertyNameAliases{\n property{name}\n alias\n system\n }\n }\n}", 65 | "SPLIT": "true" 66 | }, 67 | { 68 | "TOPIC": "Libre/subscriptions/equipmentList", 69 | "QUERY": "subscription{\n queryEquipment(filter:{not:{isActive:false},equipmentLevel:{in:[ProductionLine,ProductionUnit,ProcessCell,WorkCell,WorkCenter,WorkUnit,ControlModule,EquipmentModule]}}){\n id\n name\n dataProvider\n equipmentClass{\n name\n }\n equipmentLevel \n }\n}", 70 | "SPLIT": "false" 71 | }, 72 | { 73 | "TOPIC": "Libre/subscriptions/equipmentConfig", 74 | "QUERY": "subscription{\n queryEquipment (filter:{not:{isActive:false}}) @cascade(fields:[\"propertyNameAliases\"]){\n id\n name\n dataProvider\n dataProviderConnection\n addressTemplate\n equipmentClass{\n properties{\n id\n name\n description\n dataType\n storeHistory\n unitOfMeasure{code}\n }\n eventDefinitions{\n id\n name\n messageClass\n triggerProperties{\n id\n name\n }\n triggerExpression\n payloadProperties{\n id\n name\n }\n payloadFields{\n name\n expression\n }\n }\n }\n propertyNameAliases{\n system\n alias\n property{name}\n }\n propertyOverrides{\n property{\n id\n name\n }\n ignore\n } \n }\n}", 75 | "SPLIT": "true" 76 | } 77 | ] 78 | }, 79 | "RESTAPI": { 80 | "PORT" : "28080" 81 | }, 82 | "edge": { 83 | "loggerHook": "edge-daemon" 84 | } 85 | } 86 | 87 | 88 | -------------------------------------------------------------------------------- /Standalone/libre-core/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "libreLogger" : { 3 | "defaultLevel": "DEBUG", 4 | "defaultDestination": "CONSOLE", 5 | "loggers": [ 6 | {"MAIN": {"topic":"MAIN"}}, 7 | {"server": {"topic":"SERVER"}}, 8 | {"Influxdb" : {"topic": "Influxdb", "level": "ERROR"}}, 9 | {"edgeConnectorMQTT" : {"topic": "EDGE_CON", "level": "INFO"}}, 10 | {"edgeClient": {"topic":"EDGE_CLI", "level": "INFO"}}, 11 | {"PubSubMQTT" : {"topic": "PubSubMQTT"}}, 12 | {"PlcConnectorMQTT" : {"topic": "PLCMQTT"}}, 13 | {"graphQLTrans" : {"topic": "GQLTRANS"}}, 14 | {"DATAGQL": {"topic":"DATAGQL"}}, 15 | {"EQFINDR": {"topic":"EQFINDR"}}, 16 | {"EQCACHE": {"topic":"EQCACHE"}}, 17 | {"calendarService": {"topic": "CALENDAR", "level": "INFO"}}, 18 | {"ConfigSubscriber": {"topic":"CONFIG_SUB", "level": "INFO"}}, 19 | {"EdgeSubscriber": {"topic":"EDGE_SUB", "level": "INFO"}}, 20 | {"EquipmentHandler": {"topic":"EQHDLR", "level": "INFO"}}, 21 | {"PublishToHistorianHandler": {"topic":"PHHDLR", "level": "ERROR"}}, 22 | {"libreCore": {"topic":"CORE", "level": "DEBUG"}}, 23 | {"OperationsRequestHandler": {"topic":"OpsReqHdlr", "level": "DEBUG"}}, 24 | {"cacheConnectorMQTT": {"topic":"cacheConnMQTT", "level": "DEBUG"}}, 25 | {"": {"topic":"BLANK", "level": "INFO"}}, 26 | {"DEFAULT": {"topic":"DEFAULT", "level": "DEBUG"}}, 27 | {"MachineStateHandler": {"topic": "EVENTLOG", "level": "DEBUG"}} 28 | ] 29 | }, 30 | "libreDataStoreGraphQL" : { 31 | "GRAPHQL_URL": "http://alpha:8080/graphql", 32 | "LIBRE_DQL_URL": "dgraph-dgraph-alpha:9080" 33 | }, 34 | "pubSubConnectorMQTT" : { 35 | "MQTT_SERVER": "mqtt://mqtt:1883", 36 | "MQTT_USER": "admin", 37 | "MQTT_PWD": "public", 38 | "MQTT_SVC_NAME": "CoreServicePubSubConnector" 39 | }, 40 | "workflowEventsSubscriberMQTT" : { 41 | "MQTT_SERVER": "mqtt://mqtt:1883", 42 | "MQTT_USER": "admin", 43 | "MQTT_PWD": "public", 44 | "MQTT_SVC_NAME": "CoreServiceWorkflowEventConnector" 45 | }, 46 | "workflowCommandsSubscriberMQTT" : { 47 | "MQTT_SERVER": "mqtt://mqtt:1883", 48 | "MQTT_USER": "admin", 49 | "MQTT_PWD": "public", 50 | "MQTT_SVC_NAME": "CoreServiceWorkflowCommandConnector" 51 | }, 52 | "edgeConnectorMQTT" : { 53 | "MQTT_SERVER": "mqtt://mqtt:1883", 54 | "MQTT_USER": "admin", 55 | "MQTT_PWD": "public", 56 | "MQTT_SVC_NAME": "CoreServiceEdgeConnector", 57 | "TOPIC_TEMPLATE": "//", 58 | "TAG_DATA_CATEGORY": "EdgeTagChange", 59 | "EVENT_CATEGORY": "EdgeEvent" 60 | }, 61 | "cacheConnectorMQTT" : { 62 | "MQTT_SERVER": "mqtt://mqtt:1883", 63 | "MQTT_USER": "admin", 64 | "MQTT_PWD": "public", 65 | "MQTT_SVC_NAME": "CoreServiceCacheConnector", 66 | "TOPIC_TEMPLATE": "//", 67 | "TAG_DATA_CATEGORY": "EdgeTagChange", 68 | "EVENT_CATEGORY": "EdgeEvent" 69 | }, 70 | "GraphQLSubscriber": { 71 | "GRAPHQL_URL": "http://alpha:8080/graphql" 72 | }, 73 | "influxdb" : { 74 | "loggerHook" : "Influxdb", 75 | "serverURL" : "http://influxdb:8086", 76 | "authToken" : "mytokenmytokenmytoken", 77 | "org" : "Libre", 78 | "bucket" : "Libre" 79 | }, 80 | "equipmentCache" : { 81 | "MonitorChanges" : true 82 | }, 83 | "RESTAPI": { 84 | "PORT" : "28080" 85 | }, 86 | "CORE_FXNS": { 87 | "tagChangeWaitLimit": 30 88 | }, 89 | "handleJobRequest": { 90 | "defaultUoM": "N/A", 91 | "defaultUoMDataType": "STRING" 92 | }, 93 | "calendarService":{ 94 | "loggerHook": "calendarService", 95 | "tickDuration": "60s" 96 | }, 97 | "LibreConnectorMQTT" : { 98 | "loggerHook": "LibreConnectorMQTT", 99 | "MQTT_SERVER": "mqtt://mqtt:1883", 100 | "MQTT_USER": "admin", 101 | "MQTT_PWD": "public", 102 | "MQTT_SVC_NAME": "CoreServiceLibreConnector", 103 | "TOPIC_TEMPLATE": "//", 104 | "TAG_DATA_CATEGORY": "EdgeTagChange", 105 | "EVENT_CATEGORY": "EdgeEvent" 106 | }, 107 | "EquipmentManager" : { 108 | "eqPropMeasurementName" : "EquipmentPropertyValues", 109 | "messageClassToMeasurementMap": { 110 | "EventLog": "eventLog", 111 | "JobOrder": "jobOrder", 112 | "JobRequest": "jobRequest", 113 | "PerformanceLog": "runRateLog" 114 | } 115 | }, 116 | "RESTAPI": { 117 | "PORT" : "28080" 118 | }, 119 | "libreCoreService": { 120 | "GRAPHQL_PORT": 4002, 121 | "LIBRE_DQL_URL": "alpha:9080", 122 | "LIBRE_GRAPHQL_ENDPOINT": "http://alpha:8080/graphql", 123 | "EQUIPMENT_CONFIG_TOPIC": "Libre/subscriptions/equipmentConfig/#" 124 | } 125 | } -------------------------------------------------------------------------------- /Standalone/libre-edge-agent/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "libreLogger" : { 3 | "defaultLevel": "DEBUG", 4 | "defaultDestination": "CONSOLE", 5 | "loggers": [ 6 | {"MAIN": {"topic":"MAIN"}}, 7 | {"SERVER": {"topic":"SERVER"}}, 8 | {"EQUIPMENT" : {"topic": "EQUIPMENT"}}, 9 | {"PubSubMQTT" : {"topic": "PubSubMQTT"}}, 10 | {"PlcConnectorMQTT" : {"topic": "PLCMQTT"}}, 11 | {"graphQLTrans" : {"topic": "GQLTRANS"}}, 12 | {"RESTAPI": {"topic":"RESTAPI"}}, 13 | {"DEFAULT": {"topic": "DEFAULT"}}, 14 | {"EquipmentManager": {"topic":"EQMGR"}}, 15 | {"ManagedEquipmentDaemon": {"topic":"MGDEQD"}}, 16 | {"PlcConnectorMQTT" : {"topic": "PLCMQTT"}}, 17 | {"tagChangeHandlerFactory" : {"topic": "THFACT"}}, 18 | {"managedEquipmentDefault" : {"topic": "MGDEQ"}}, 19 | {"DATAGQL": {"topic":"DATAGQL"}}, 20 | {"EQFINDR": {"topic":"EQFINDR"}}, 21 | {"EQCACHE": {"topic":"EQCACHE"}}, 22 | {"EdgeService": {"topic":"EdgeService"}}, 23 | {"valueChangeFilterFactory": {"topic":"ValChng"}}, 24 | {"": {"topic":"DEFAULT", "level": "INFO"}} 25 | ] 26 | }, 27 | "PubSubConnectorMQTT" : { 28 | "MQTT_SERVER": "mqtt://mqtt:1883", 29 | "MQTT_USER": "admin", 30 | "MQTT_PWD": "public", 31 | "MQTT_SVC_NAME": "libre-edge-agent-pubsub-gn" 32 | }, 33 | "PlcConnectorOPCUA" : { 34 | "ENDPOINT": "opc.tcp://127.0.0.1:58018/NodeOPCUA-Server", 35 | "aliasSystem": "OPCUA", 36 | "OVERRIDE_ENDPOINTURL": "opc.tcp://127.0.0.1:58018/NodeOPCUA-Server" 37 | }, 38 | "PlcConnectorMQTT" : { 39 | "MQTT_SERVER": "mqtt://mqtt:1883", 40 | "MQTT_USER": "admin", 41 | "MQTT_PWD": "public", 42 | "MQTT_SVC_NAME": "PlcToEdgeAgent", 43 | "TOPIC_TEMPLATES": [ 44 | "/Status/", 45 | "/Status/Parameter//", 46 | "/Status/Product//ProcessParameter//", 47 | "/Status/Product//Ingredient//", 48 | "/Status/Product//Ingredient//Parameter//", 49 | "/Admin/", 50 | "/Admin/ProdConsumedCount//", 51 | "/Admin/ProdProcessedCount//", 52 | "/Admin/ProdDefectiveCount//" 53 | ] 54 | }, 55 | "EdgeConnectorMQTT" : { 56 | "MQTT_SERVER": "mqtt://mqtt:1883", 57 | "MQTT_USER": "admin", 58 | "MQTT_PWD": "public", 59 | "MQTT_SVC_NAME": "libre-edge-agent-edgeConnector-gn", 60 | "TOPIC_TEMPLATE": "//", 61 | "TAG_DATA_CATEGORY": "EdgeTagChange", 62 | "EVENT_CATEGORY": "EdgeEvent" 63 | }, 64 | "RESTAPI": { 65 | "PORT" : "28080" 66 | }, 67 | "EdgeService": { 68 | "PLC_CONNECTORS": [ 69 | "MQTT" 70 | ] 71 | }, 72 | "edge": { 73 | "loggerHook": "daemon", 74 | "commandWaitDuration": "500ms" 75 | }, 76 | "eventDefEvaluator": { 77 | "EventPayloadDelayMilliseconds": "5s" 78 | }, 79 | "equipmentList": { 80 | "nameList": [ 81 | ] 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /Standalone/libre-gateway/supergraph.yaml: -------------------------------------------------------------------------------- 1 | # Copyright 2021 Libre Technologies LLC 2 | subgraphs: 3 | schema: 4 | routing_url: http://host.docker.internal:8080/graphql 5 | schema: 6 | file: ./subgraphs/schema-mod.graphql 7 | core: 8 | routing_url: http://host.docker.internal:4002/query 9 | schema: 10 | file: ./subgraphs/core.graphql 11 | -------------------------------------------------------------------------------- /Standalone/libre-workflow-pubsub/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "libreLogger" : { 3 | "defaultLevel": "DEBUG", 4 | "defaultDestination": "CONSOLE", 5 | "loggers": [ 6 | {"MAIN": {"topic":"MAIN"}}, 7 | {"server": {"topic":"SERVER"}}, 8 | {"EquipmentManager": {"topic":"EQMGR"}}, 9 | {"ManagedEquipmentHandler": {"topic":"EQHNDLR"}}, 10 | {"PlcConnectorMQTT" : {"topic": "PLCMQTT"}}, 11 | {"graphQLTrans" : {"topic": "GQLTRANS"}}, 12 | {"tagChangeHandlerFactory" : {"topic": "THFACT"}}, 13 | {"managedEquipmentDefault" : {"topic": "MGDEQ"}}, 14 | {"DATAGQL": {"topic":"DATAGQL"}}, 15 | {"EQFINDR": {"topic":"EQFINDR"}}, 16 | {"EQCACHE": {"topic":"EQCACHE"}}, 17 | {"LIBRCONN": {"topic":"LIBRCONN"}}, 18 | {"EVTDISTR": {"topic":"EVTDISTR"}}, 19 | {"EVTEVALR": {"topic":"EVTEVALR"}}, 20 | {"valueChangeFilterFactory": {"topic":"FLTRFCTR"}}, 21 | {"edge-daemon": {"topic":"EDGEDMON"}}, 22 | {"EVNTEVAL": {"topic":"EVNTEVAL"}}, 23 | {"TAGCHNG": {"topic":"TAGCHNG"}}, 24 | {"MgdEqHandler": {"topic": "EQDMON"}}, 25 | {"RESTAPI": {"topic":"RESTAPI"}}, 26 | {"WF_FXNS": {"topic":"WF_FXNS"}}, 27 | {"PubSubMQTT": {"topic":"PubSubMQTT"}}, 28 | {"DEFAULT": {"topic": "DEFAULT"}}, 29 | {"Workflow_GQL": {"topic": "Workflow_GQL"}} 30 | ] 31 | }, 32 | "pubSubConnectorMQTT" : { 33 | "MQTT_SERVER": "mqtt://mqtt:1883", 34 | "MQTT_USER": "admin", 35 | "MQTT_PWD": "public", 36 | "MQTT_SVC_NAME": "Workflow-GN" 37 | }, 38 | "libreDataStoreGraphQL" : { 39 | "GRAPHQL_URL": "http://alpha:8080/graphql" 40 | }, 41 | "RESTAPI": { 42 | "PORT" : "28080" 43 | }, 44 | "workflowFunctions" : { 45 | "loggerHook" : "WF_FXNS", 46 | "tagChangeWaitLimit" : "5" 47 | }, 48 | "workflow": { 49 | 50 | } 51 | } 52 | 53 | 54 | -------------------------------------------------------------------------------- /Standalone/schema/g01.rdf.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/Standalone/schema/g01.rdf.gz -------------------------------------------------------------------------------- /docs/LibreArchitecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/libremfg/getting-started/5e427edc5d4ab3bb1f596cc480b819ef283000d8/docs/LibreArchitecture.png --------------------------------------------------------------------------------