├── scraper ├── .gitignore ├── .prettierrc ├── compose.yaml ├── package.json ├── Dockerfile ├── .dockerignore ├── index.js └── package-lock.json ├── grafana ├── .gitignore ├── cfg │ ├── prometheus.yaml │ └── grafana │ │ ├── datasource.yaml │ │ ├── dashboard.yaml │ │ └── dashboards │ │ └── statisfactory.json ├── .env.example ├── generate_dashboard.js ├── compose.yaml ├── README.md └── data │ ├── max.json │ └── dashboard_template.json ├── .clang-format ├── Config ├── PluginSettings.ini ├── Alpakit.ini └── AccessTransformers.ini ├── Resources └── Icon128.png ├── .prettierrc ├── Source └── Statisfactory │ ├── Private │ ├── LogStatisfactory.cpp │ ├── FStatisfactoryModule.cpp │ ├── UStatisfactoryWorldSubsystem.cpp │ └── UStatisfactoryController.cpp │ ├── Public │ ├── LogStatisfactory.h │ ├── FStatisfactoryModule.h │ ├── UStatisfactoryWorldSubsystem.h │ └── UStatisfactoryController.h │ └── Statisfactory.Build.cs ├── Statisfactory.uplugin ├── README.md ├── LICENSE ├── .gitignore ├── .github └── workflows │ └── scraper.yaml └── .editorconfig /scraper/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .env 3 | -------------------------------------------------------------------------------- /grafana/.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | compose.local.yaml 3 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | BasedOnStyle: LLVM 3 | ColumnLimit: 120 4 | -------------------------------------------------------------------------------- /Config/PluginSettings.ini: -------------------------------------------------------------------------------- 1 | [StageSettings] 2 | +AdditionalNonUSFDirectories=Resources 3 | -------------------------------------------------------------------------------- /Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NotNite/Statisfactory/HEAD/Resources/Icon128.png -------------------------------------------------------------------------------- /Config/Alpakit.ini: -------------------------------------------------------------------------------- 1 | [ModTargets] 2 | Targets=Windows 3 | Targets=WindowsServer 4 | Targets=LinuxServer 5 | 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "trailingComma": "none", 4 | "tabWidth": 2, 5 | "singleQuote": false 6 | } 7 | -------------------------------------------------------------------------------- /scraper/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "trailingComma": "none", 4 | "tabWidth": 2, 5 | "singleQuote": false 6 | } 7 | -------------------------------------------------------------------------------- /Source/Statisfactory/Private/LogStatisfactory.cpp: -------------------------------------------------------------------------------- 1 | #include "LogStatisfactory.h" 2 | #include "Logging/LogMacros.h" 3 | 4 | DEFINE_LOG_CATEGORY(LogStatisfactory); 5 | -------------------------------------------------------------------------------- /Source/Statisfactory/Public/LogStatisfactory.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "Logging/LogMacros.h" 3 | 4 | DECLARE_LOG_CATEGORY_EXTERN(LogStatisfactory, Verbose, All); 5 | -------------------------------------------------------------------------------- /grafana/cfg/prometheus.yaml: -------------------------------------------------------------------------------- 1 | scrape_configs: 2 | - job_name: "prometheus" 3 | scrape_interval: 5s 4 | static_configs: 5 | - targets: ["statisfactory:8080"] 6 | metrics_path: "/metrics" 7 | -------------------------------------------------------------------------------- /Config/AccessTransformers.ini: -------------------------------------------------------------------------------- 1 | [AccessTransformers] 2 | Friend = (Class="AFGCircuitSubsystem", FriendClass="UStatisfactoryController") 3 | Friend = (Class="UFGServerAPIManager", FriendClass="UStatisfactoryWorldSubsystem") 4 | -------------------------------------------------------------------------------- /scraper/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | statisfactory: 3 | build: 4 | context: . 5 | environment: 6 | NODE_ENV: production 7 | env_file: 8 | - .env 9 | ports: 10 | - 8080:8080 11 | -------------------------------------------------------------------------------- /grafana/cfg/grafana/datasource.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | datasources: 4 | - name: Prometheus 5 | type: prometheus 6 | url: http://prometheus:9090 7 | uid: adyhxpuakmrcwf 8 | isDefault: true 9 | access: proxy 10 | editable: true 11 | -------------------------------------------------------------------------------- /grafana/.env.example: -------------------------------------------------------------------------------- 1 | GAME_TOKEN="output of server.GenerateAPIToken goes here" 2 | TZ="America/New_York" 3 | # Change this if: 4 | # - you have an old Docker version 5 | # - your server runs on a different port 6 | # - your server runs on a separate machine 7 | GAME_ENDPOINT="https://host.docker.internal:7777/api/v1" 8 | -------------------------------------------------------------------------------- /Source/Statisfactory/Public/FStatisfactoryModule.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "CoreMinimal.h" 4 | #include "Modules/ModuleManager.h" 5 | 6 | class FStatisfactoryModule : public IModuleInterface { 7 | public: 8 | virtual void StartupModule() override; 9 | virtual void ShutdownModule() override; 10 | }; 11 | -------------------------------------------------------------------------------- /scraper/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "statisfactory", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "private": true, 6 | "main": "index.js", 7 | "dependencies": { 8 | "cron": "^3.1.7", 9 | "dotenv": "^16.4.5", 10 | "express": "^4.19.2", 11 | "prom-client": "^15.1.3" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /grafana/cfg/grafana/dashboard.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: 1 2 | 3 | providers: 4 | - name: "Dashboard provider" 5 | orgId: 1 6 | type: file 7 | disableDeletion: false 8 | updateIntervalSeconds: 10 9 | allowUiUpdates: false 10 | options: 11 | path: /var/lib/grafana/dashboards 12 | foldersFromFilesStructure: true 13 | -------------------------------------------------------------------------------- /Source/Statisfactory/Private/FStatisfactoryModule.cpp: -------------------------------------------------------------------------------- 1 | #include "FStatisfactoryModule.h" 2 | 3 | #define LOCTEXT_NAMESPACE "FStatisfactoryModule" 4 | 5 | void FStatisfactoryModule::StartupModule() {} 6 | void FStatisfactoryModule::ShutdownModule() {} 7 | 8 | #undef LOCTEXT_NAMESPACE 9 | 10 | IMPLEMENT_MODULE(FStatisfactoryModule, Statisfactory) 11 | -------------------------------------------------------------------------------- /scraper/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22.8.0-alpine 2 | ENV NODE_ENV production 3 | WORKDIR /usr/src/app 4 | 5 | RUN --mount=type=bind,source=package.json,target=package.json \ 6 | --mount=type=bind,source=package-lock.json,target=package-lock.json \ 7 | --mount=type=cache,target=/root/.npm \ 8 | npm ci --omit=dev 9 | 10 | USER node 11 | COPY . . 12 | EXPOSE 8080 13 | CMD node index.js 14 | -------------------------------------------------------------------------------- /Source/Statisfactory/Public/UStatisfactoryWorldSubsystem.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "UStatisfactoryController.h" 3 | #include "WorldSubsystem.h" 4 | 5 | #include "UStatisfactoryWorldSubsystem.generated.h" 6 | 7 | UCLASS() 8 | class UStatisfactoryWorldSubsystem : public UWorldSubsystem { 9 | GENERATED_BODY() 10 | 11 | public: 12 | UStatisfactoryWorldSubsystem(); 13 | virtual void PostInitialize() override; 14 | 15 | UPROPERTY() 16 | UStatisfactoryController *Controller; 17 | 18 | private: 19 | void RegisterRoute(UFGServerAPIManager *Manager, const char *Name); 20 | }; 21 | -------------------------------------------------------------------------------- /grafana/generate_dashboard.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const template = JSON.parse( 3 | fs.readFileSync("./data/dashboard_template.json", "utf8") 4 | ); 5 | const max = JSON.parse(fs.readFileSync("./data/max.json", "utf8")); 6 | const out = "./cfg/grafana/dashboards/statisfactory.json"; 7 | 8 | const panel = template.panels.find((p) => p.title === "Dimensional Depots"); 9 | panel.fieldConfig.defaults.overrides = Object.entries(max).map( 10 | ([key, value]) => ({ 11 | matcher: { 12 | id: "byName", 13 | options: key 14 | }, 15 | properties: [ 16 | { 17 | id: "max", 18 | value: value 19 | } 20 | ] 21 | }) 22 | ); 23 | 24 | fs.writeFileSync(out, JSON.stringify(template, null, 2)); 25 | -------------------------------------------------------------------------------- /Statisfactory.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "Version": 1, 4 | "VersionName": "1.0.0", 5 | "FriendlyName": "Statisfactory", 6 | "Description": "HTTP API stats for Satisfactory", 7 | "Category": "Modding", 8 | "CreatedBy": "NotNite", 9 | "CreatedByURL": "https://notnite.com/", 10 | "DocsURL": "https://github.com/NotNite/Statisfactory", 11 | "MarketplaceURL": "", 12 | "SupportURL": "https://github.com/NotNite/Statisfactory/issues", 13 | "CanContainContent": true, 14 | "IsBetaVersion": false, 15 | "IsExperimentalVersion": false, 16 | "Installed": false, 17 | "Modules": [ 18 | { 19 | "Name": "Statisfactory", 20 | "Type": "Runtime", 21 | "LoadingPhase": "Default" 22 | } 23 | ], 24 | "Plugins": [], 25 | "GameVersion": ">=365306", 26 | "SemVersion": "1.0.0" 27 | } -------------------------------------------------------------------------------- /scraper/.dockerignore: -------------------------------------------------------------------------------- 1 | # Include any files or directories that you don't want to be copied to your 2 | # container here (e.g., local build artifacts, temporary files, etc.). 3 | # 4 | # For more help, visit the .dockerignore file reference guide at 5 | # https://docs.docker.com/go/build-context-dockerignore/ 6 | 7 | **/.classpath 8 | **/.dockerignore 9 | **/.env 10 | **/.git 11 | **/.gitignore 12 | **/.project 13 | **/.settings 14 | **/.toolstarget 15 | **/.vs 16 | **/.vscode 17 | **/.next 18 | **/.cache 19 | **/*.*proj.user 20 | **/*.dbmdl 21 | **/*.jfm 22 | **/charts 23 | **/docker-compose* 24 | **/compose.y*ml 25 | **/Dockerfile* 26 | **/node_modules 27 | **/npm-debug.log 28 | **/obj 29 | **/secrets.dev.yaml 30 | **/values.dev.yaml 31 | **/build 32 | **/dist 33 | LICENSE 34 | README.md 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Statisfactory 2 | 3 | HTTP API stats for Satisfactory. 4 | 5 | ## Setting up Grafana 6 | 7 | If you've never used Grafana or Prometheus before, follow [this guide](https://github.com/NotNite/Statisfactory/blob/main/grafana/README.md) to set up a new Grafana instance on your server. 8 | 9 | ## Running the scraper 10 | 11 | Run `server.GenerateAPIToken` in your server console, then create `scraper/.env`: 12 | 13 | ```text 14 | GAME_ENDPOINT="https://localhost:7777/api/v1" 15 | GAME_TOKEN="output of server.GenerateAPIToken" 16 | PORT=8080 17 | ``` 18 | 19 | Then point a Prometheus node at `http://localhost:8080/metrics`. 20 | 21 | ## Credits 22 | 23 | Statisfactory uses [Mutant Standard](https://mutant.tech/) emoji, licensed [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). 24 | -------------------------------------------------------------------------------- /grafana/compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | statisfactory: 3 | image: ghcr.io/notnite/statisfactory-scraper:latest 4 | restart: unless-stopped 5 | env_file: 6 | - .env 7 | environment: 8 | - PORT=8080 9 | 10 | grafana: 11 | image: grafana/grafana:latest 12 | restart: unless-stopped 13 | ports: 14 | # Change this if port 3000 is taken on your machine 15 | - 3000:3000 16 | volumes: 17 | - grafana:/var/lib/grafana 18 | - ./cfg/grafana/dashboard.yaml:/etc/grafana/provisioning/dashboards/dashboard.yaml 19 | - ./cfg/grafana/datasource.yaml:/etc/grafana/provisioning/datasources/datasource.yaml 20 | - ./cfg/grafana/dashboards:/var/lib/grafana/dashboards 21 | 22 | prometheus: 23 | image: prom/prometheus:latest 24 | restart: unless-stopped 25 | command: 26 | - '--config.file=/etc/prometheus/prometheus.yaml' 27 | volumes: 28 | - prometheus:/prometheus 29 | - ./cfg/prometheus.yaml:/etc/prometheus/prometheus.yaml 30 | 31 | volumes: 32 | grafana: 33 | prometheus: 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 NotNite 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Visual Studio 2015 user specific files 2 | .vs/ 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | 22 | # Compiled Static libraries 23 | *.lai 24 | *.la 25 | *.a 26 | *.lib 27 | 28 | # Executables 29 | *.exe 30 | *.out 31 | *.app 32 | *.ipa 33 | 34 | # These project files can be generated by the engine 35 | *.xcodeproj 36 | *.xcworkspace 37 | *.sln 38 | *.suo 39 | *.opensdf 40 | *.sdf 41 | *.VC.db 42 | *.VC.opendb 43 | 44 | # Precompiled Assets 45 | SourceArt/**/*.png 46 | SourceArt/**/*.tga 47 | 48 | # Binary Files 49 | Binaries/* 50 | Plugins/*/Binaries/* 51 | 52 | # Builds 53 | Build/* 54 | 55 | # Whitelist PakBlacklist-.txt files 56 | !Build/*/ 57 | Build/*/** 58 | !Build/*/PakBlacklist*.txt 59 | 60 | # Don't ignore icon files in Build 61 | !Build/**/*.ico 62 | 63 | # Built data for maps 64 | *_BuiltData.uasset 65 | 66 | # Configuration files generated by the Editor 67 | Saved/* 68 | 69 | # Compiled source files for the engine to use 70 | Intermediate/* 71 | Plugins/*/Intermediate/* 72 | 73 | # Cache files for the editor to use 74 | DerivedDataCache/* -------------------------------------------------------------------------------- /.github/workflows/scraper.yaml: -------------------------------------------------------------------------------- 1 | name: Deploy scraper Docker image 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | scraper: 11 | name: Deploy scraper Docker image 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout repository 15 | uses: actions/checkout@v2 16 | 17 | - name: Set repo owner to lowercase 18 | run: echo "REPO_OWNER=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV 19 | 20 | - name: Setup Docker buildx 21 | uses: docker/setup-buildx-action@v2 22 | 23 | - name: Login to GitHub Container Registry 24 | uses: docker/login-action@v1 25 | with: 26 | registry: ghcr.io 27 | username: ${{ github.repository_owner }} 28 | password: ${{ secrets.GITHUB_TOKEN }} 29 | 30 | # Use 'latest' for the main branch, otherwise use the tag name 31 | - name: Set image tag 32 | run: echo "IMAGE_TAG=$(if [ ${{ github.ref }} = 'refs/heads/main' ]; then echo 'latest'; else echo ${{ github.ref }} | sed -e 's/refs\/tags\///g'; fi)" >> $GITHUB_ENV 33 | 34 | - name: Build and push Docker image 35 | uses: docker/build-push-action@v2 36 | with: 37 | context: scraper 38 | push: true 39 | tags: ghcr.io/${{ env.REPO_OWNER }}/statisfactory-scraper:${{ env.IMAGE_TAG }} 40 | cache-from: type=gha 41 | cache-to: type=gha,mode=max 42 | -------------------------------------------------------------------------------- /Source/Statisfactory/Private/UStatisfactoryWorldSubsystem.cpp: -------------------------------------------------------------------------------- 1 | #include "UStatisfactoryWorldSubsystem.h" 2 | 3 | #include "Engine/World.h" 4 | #include "FGServerAPIManager.h" 5 | #include "FGServerSubsystem.h" 6 | #include "UStatisfactoryController.h" 7 | 8 | UStatisfactoryWorldSubsystem::UStatisfactoryWorldSubsystem() { 9 | // I have no idea what I'm doing and it shows 10 | this->Controller = NewObject(); 11 | this->Controller->World = this->GetWorld(); 12 | } 13 | 14 | void UStatisfactoryWorldSubsystem::RegisterRoute(UFGServerAPIManager *Manager, const char *Name) { 15 | auto Handler = FFGRequestHandlerRegistration(); 16 | Handler.HandlerObject = this->Controller; 17 | Handler.HandlerFunction = this->Controller->FindFunction(Name); 18 | Handler.FunctionName = FName(Name); 19 | Handler.PrivilegeLevel = EPrivilegeLevel::Administrator; 20 | Manager->mRegisteredHandlers.Add(FString(Name), Handler); 21 | } 22 | 23 | void UStatisfactoryWorldSubsystem::PostInitialize() { 24 | const auto World = this->GetWorld(); 25 | if (World == nullptr) 26 | return; 27 | 28 | const auto GameInstance = World->GetGameInstance(); 29 | if (GameInstance == nullptr) 30 | return; 31 | 32 | const auto Subsystem = GameInstance->GetSubsystem(); 33 | if (Subsystem == nullptr) 34 | return; 35 | 36 | const auto ServerAPIManager = Subsystem->GetServerAPIManager(); 37 | if (ServerAPIManager == nullptr) 38 | return; 39 | 40 | // The API registering doesn't work for me? so this will do 41 | this->RegisterRoute(ServerAPIManager, "Statisfactory_GetPower"); 42 | this->RegisterRoute(ServerAPIManager, "Statisfactory_GetDepots"); 43 | this->RegisterRoute(ServerAPIManager, "Statisfactory_GetSink"); 44 | this->RegisterRoute(ServerAPIManager, "Statisfactory_GetTrains"); 45 | } 46 | -------------------------------------------------------------------------------- /Source/Statisfactory/Public/UStatisfactoryController.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "CoreMinimal.h" 3 | #include "FGServerControllerBase.h" 4 | #include "Server/FGDSSharedTypes.h" 5 | 6 | #include "UStatisfactoryController.generated.h" 7 | 8 | USTRUCT() 9 | struct FPowerOutput { 10 | GENERATED_BODY() 11 | 12 | UPROPERTY() 13 | int Id; 14 | 15 | UPROPERTY() 16 | float PowerConsumed; 17 | 18 | UPROPERTY() 19 | float PowerProduced; 20 | 21 | UPROPERTY() 22 | float PowerProductionCapacity; 23 | 24 | UPROPERTY() 25 | float MaximumPowerConsumption; 26 | 27 | UPROPERTY() 28 | float BatteryPowerInput; 29 | }; 30 | 31 | USTRUCT() 32 | struct FTicketData { 33 | GENERATED_BODY() 34 | 35 | UPROPERTY() 36 | int Coupons; 37 | 38 | UPROPERTY() 39 | int PointsToNextCoupon; 40 | }; 41 | 42 | USTRUCT() 43 | struct FTrainData { 44 | GENERATED_BODY() 45 | 46 | UPROPERTY() 47 | FString Name; 48 | 49 | UPROPERTY() 50 | float X; 51 | 52 | UPROPERTY() 53 | float Y; 54 | 55 | UPROPERTY() 56 | float Z; 57 | }; 58 | 59 | UCLASS() 60 | class STATISFACTORY_API UStatisfactoryController : public UFGServerControllerBase { 61 | GENERATED_BODY() 62 | 63 | public: 64 | // Jank lol 65 | UPROPERTY() 66 | UWorld *World; 67 | 68 | UFUNCTION(FGServerRequestHandler, FGServerRequestPrivilegeLevel = "Administrator") 69 | FFGServerErrorResponse Statisfactory_GetPower(TArray &OutData) const; 70 | 71 | UFUNCTION(FGServerRequestHandler, FGServerRequestPrivilegeLevel = "Administrator") 72 | FFGServerErrorResponse Statisfactory_GetDepots(TMap &OutData) const; 73 | 74 | UFUNCTION(FGServerRequestHandler, FGServerRequestPrivilegeLevel = "Administrator") 75 | FFGServerErrorResponse Statisfactory_GetSink(FTicketData &OutData) const; 76 | 77 | UFUNCTION(FGServerRequestHandler, FGServerRequestPrivilegeLevel = "Administrator") 78 | FFGServerErrorResponse Statisfactory_GetTrains(TArray &OutData) const; 79 | }; 80 | -------------------------------------------------------------------------------- /grafana/README.md: -------------------------------------------------------------------------------- 1 | # Statisfactory + Grafana 2 | 3 | This Docker Compose stack sets up a Grafana instance automatically. It uses my personal config, but you're free to change it if you like. 4 | 5 | ## How it works 6 | 7 | Think of it as a chain of servers talking to each other: 8 | 9 | - Your Satisfactory game server exposes the relevant stats 10 | - The Statisfactory scraper node periodically fetches data from the game server 11 | - Prometheus (metric software) periodically fetches data from the scraper node 12 | - Grafana (graphing software) periodically fetches data from Prometheus 13 | 14 | ## Requirements 15 | 16 | - A running Satisfactory server with Statisfactory installed 17 | - A server to run Grafana on with [Docker](https://docs.docker.com/engine/install) installed 18 | - Git (to clone this repository) 19 | - Some knowledge of the command line (moving around and editing files) 20 | 21 | ## Setup 22 | 23 | - In Server Manager > (your server) > Console, run the command `server.GenerateAPIToken` 24 | - Save this for later, it should start with `ew` 25 | - Clone this repository: `git clone https://github.com/NotNite/Statisfactory.git` 26 | - Go into this folder: `cd Statisfactory/grafana` 27 | - Create your own environment file: `cp .env.example .env` 28 | - Edit the `.env` file 29 | - Enter your API key for the server 30 | - Change your [time zone](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) 31 | - Change the server IP if required 32 | - (Optional) If port 3000 is taken on your machine, edit the port for the Grafana server in `compose.yaml` 33 | - Bring up the stack: `docker compose up --build -d` 34 | - Go to `http://:3000/` 35 | - If your server has a firewall, open the port 36 | - Change the admin password on Grafana (default login is username `admin` password `admin`) 37 | - (Optional, for advanced users) [Set up a reverse proxy for your Grafana instance](https://grafana.com/tutorials/run-grafana-behind-a-proxy/) 38 | 39 | Have fun! 40 | -------------------------------------------------------------------------------- /Source/Statisfactory/Statisfactory.Build.cs: -------------------------------------------------------------------------------- 1 | using UnrealBuildTool; 2 | 3 | // ReSharper disable RedundantExplicitArrayCreation 4 | // ReSharper disable UseCollectionExpression 5 | 6 | public class Statisfactory : ModuleRules { 7 | public Statisfactory(ReadOnlyTargetRules target) : base(target) { 8 | this.PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; 9 | 10 | this.PublicDependencyModuleNames.AddRange(new string[] { 11 | "Core", "CoreUObject", 12 | "Engine", 13 | "DeveloperSettings", 14 | "PhysicsCore", 15 | "InputCore", 16 | //"OnlineSubsystem", "OnlineSubsystemUtils", "OnlineSubsystemNull", 17 | //"SignificanceManager", 18 | "GeometryCollectionEngine", 19 | //"ChaosVehiclesCore", "ChaosVehicles", "ChaosSolverEngine", 20 | "AnimGraphRuntime", 21 | //"AkAudio", 22 | "AssetRegistry", 23 | "NavigationSystem", 24 | //"ReplicationGraph", 25 | "AIModule", 26 | "GameplayTasks", 27 | "SlateCore", "Slate", "UMG", 28 | //"InstancedSplines", 29 | "RenderCore", 30 | "CinematicCamera", 31 | "Foliage", 32 | //"Niagara", 33 | //"EnhancedInput", 34 | //"GameplayCameras", 35 | //"TemplateSequence", 36 | "NetCore", 37 | "GameplayTags", 38 | "Json", "JsonUtilities" 39 | }); 40 | 41 | // FactoryGame plugins 42 | this.PublicDependencyModuleNames.AddRange(new string[] { 43 | //"AbstractInstance", 44 | //"InstancedSplinesComponent", 45 | //"SignificanceISPC" 46 | }); 47 | 48 | // Header stubs 49 | this.PublicDependencyModuleNames.AddRange(new string[] { 50 | "DummyHeaders", 51 | }); 52 | 53 | if (target.Type == TargetRules.TargetType.Editor) { 54 | this.PublicDependencyModuleNames.AddRange(new string[] { /*"OnlineBlueprintSupport",*/ "AnimGraph"}); 55 | } 56 | 57 | this.PublicDependencyModuleNames.AddRange(new string[] {"FactoryGame", "FactoryDedicatedServer"}); 58 | 59 | this.PublicIncludePaths.AddRange(new string[] { 60 | // ... add public include paths required here ... 61 | }); 62 | 63 | this.PrivateIncludePaths.AddRange(new string[] { 64 | // ... add private include paths required here ... 65 | }); 66 | 67 | this.PublicDependencyModuleNames.AddRange(new string[] { 68 | // ... add public dependencies that you statically link with here ... 69 | }); 70 | 71 | this.PrivateDependencyModuleNames.AddRange(new string[] { 72 | // ... add private dependencies that you statically link with here ... 73 | }); 74 | 75 | this.DynamicallyLoadedModuleNames.AddRange(new string[] { 76 | // ... add any modules that your module loads dynamically here ... 77 | }); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /Source/Statisfactory/Private/UStatisfactoryController.cpp: -------------------------------------------------------------------------------- 1 | #include "UStatisfactoryController.h" 2 | 3 | #include "../../../../../Source/FactoryGame/Public/Server/FGDSSharedTypes.h" 4 | #include "FGCentralStorageSubsystem.h" 5 | #include "FGCircuitSubsystem.h" 6 | #include "FGRailroadSubsystem.h" 7 | #include "FGResourceSinkSubsystem.h" 8 | #include "FGTrain.h" 9 | 10 | static FFGServerErrorResponse SubsystemError = 11 | FFGServerErrorResponse::Error("statisfactory_subsystem", "Couldn't get subsystem"); 12 | 13 | FFGServerErrorResponse STATISFACTORY_API 14 | UStatisfactoryController::Statisfactory_GetPower(TArray &OutData) const { 15 | OutData = {}; 16 | 17 | auto Subsystem = AFGCircuitSubsystem::Get(this->World); 18 | if (Subsystem == nullptr) 19 | return SubsystemError; 20 | 21 | TArray Seen = {}; 22 | for (auto Pair : Subsystem->mCircuits) { 23 | auto Circuit = Pair.Value; 24 | if (const auto PowerCircuit = Cast(Circuit)) { 25 | auto Id = PowerCircuit->GetCircuitGroupID(); 26 | if (Id == -1 || Seen.Contains(Id)) 27 | continue; 28 | Seen.Push(Id); 29 | 30 | FPowerCircuitStats Stats = {}; 31 | PowerCircuit->GetStats(Stats); 32 | 33 | FPowerOutput PowerOutput = {}; 34 | PowerOutput.Id = Id; 35 | PowerOutput.PowerConsumed = Stats.PowerConsumed; 36 | PowerOutput.PowerProduced = Stats.PowerProduced; 37 | PowerOutput.PowerProductionCapacity = Stats.PowerProductionCapacity; 38 | PowerOutput.MaximumPowerConsumption = Stats.MaximumPowerConsumption; 39 | PowerOutput.BatteryPowerInput = Stats.BatteryPowerInput; 40 | OutData.Add(PowerOutput); 41 | } 42 | } 43 | 44 | return FFGServerErrorResponse::Ok(); 45 | } 46 | 47 | FFGServerErrorResponse UStatisfactoryController::Statisfactory_GetDepots(TMap &OutData) const { 48 | OutData = {}; 49 | 50 | auto Subsystem = AFGCentralStorageSubsystem::Get(this->World); 51 | if (Subsystem == nullptr) 52 | return SubsystemError; 53 | 54 | TArray Out; 55 | Subsystem->GetAllItemsFromCentralStorage(Out); 56 | 57 | for (auto Item : Out) { 58 | auto Name = UFGItemDescriptor::GetItemName(Item.ItemClass.Get()); 59 | auto Amount = Item.Amount; 60 | OutData.Add(Name.ToString(), Amount); 61 | } 62 | 63 | return FFGServerErrorResponse::Ok(); 64 | } 65 | 66 | FFGServerErrorResponse UStatisfactoryController::Statisfactory_GetSink(FTicketData &OutData) const { 67 | OutData = {}; 68 | auto Subsystem = AFGResourceSinkSubsystem::Get(this->World); 69 | if (Subsystem == nullptr) 70 | return SubsystemError; 71 | 72 | OutData.Coupons = Subsystem->GetNumCoupons(); 73 | OutData.PointsToNextCoupon = Subsystem->GetNumPointsToNextCoupon(EResourceSinkTrack::RST_Default); 74 | 75 | return FFGServerErrorResponse::Ok(); 76 | } 77 | 78 | FFGServerErrorResponse UStatisfactoryController::Statisfactory_GetTrains(TArray &OutData) const { 79 | OutData = {}; 80 | auto Subsystem = AFGRailroadSubsystem::Get(this->World); 81 | if (Subsystem == nullptr) 82 | return SubsystemError; 83 | 84 | TArray Trains = {}; 85 | Subsystem->GetAllTrains(Trains); 86 | for (const auto Train : Trains) { 87 | FTrainData Data = {}; 88 | Data.Name = Train->GetTrainName().ToString(); 89 | auto Position = Train->mSimulationData.TrainLocation; 90 | Data.X = Position.X; 91 | Data.Y = Position.Y; 92 | Data.Z = Position.Z; 93 | OutData.Add(Data); 94 | } 95 | 96 | return FFGServerErrorResponse::Ok(); 97 | } 98 | -------------------------------------------------------------------------------- /scraper/index.js: -------------------------------------------------------------------------------- 1 | import "dotenv/config"; 2 | import express from "express"; 3 | import client, { register } from "prom-client"; 4 | import { CronJob } from "cron"; 5 | 6 | const app = express(); 7 | app.get("/metrics", async (_req, res) => { 8 | try { 9 | res.set("Content-Type", register.contentType); 10 | res.end(await register.metrics()); 11 | } catch (err) { 12 | res.status(500).end(err); 13 | } 14 | }); 15 | app.listen(process.env.PORT); 16 | 17 | process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; // :( 18 | 19 | async function execute(command) { 20 | const req = await fetch(process.env.GAME_ENDPOINT, { 21 | method: "POST", 22 | body: JSON.stringify({ function: command }), 23 | headers: { 24 | "Content-Type": "application/json", 25 | Authorization: `Bearer ${process.env.GAME_TOKEN}` 26 | } 27 | }); 28 | const data = await req.json(); 29 | if (!req.ok || (data != null && data.error)) { 30 | console.error(data); 31 | throw new Error(data); 32 | } 33 | return data.data.data; 34 | } 35 | 36 | const prefix = "Statisfactory"; 37 | const getPower = prefix + "_GetPower"; 38 | const getDepots = prefix + "_GetDepots"; 39 | const getSink = prefix + "_GetSink"; 40 | const getTrains = prefix + "_GetTrains"; 41 | 42 | const powerConsumed = new client.Gauge({ 43 | name: "power_consumed", 44 | help: "Power consumed" 45 | }); 46 | const powerProduced = new client.Gauge({ 47 | name: "power_produced", 48 | help: "Power produced" 49 | }); 50 | const powerProductionCapacity = new client.Gauge({ 51 | name: "power_production_capacity", 52 | help: "Power production capacity" 53 | }); 54 | const maximumPowerConsumption = new client.Gauge({ 55 | name: "maximum_power_consumption", 56 | help: "Maximum power consumption" 57 | }); 58 | const batteryPowerInput = new client.Gauge({ 59 | name: "battery_power_input", 60 | help: "Battery power input" 61 | }); 62 | 63 | const depotItem = new client.Gauge({ 64 | name: "depot", 65 | help: "Depot items", 66 | labelNames: ["item"] 67 | }); 68 | 69 | const coupons = new client.Gauge({ 70 | name: "coupons", 71 | help: "Coupons" 72 | }); 73 | const pointsToNextCoupon = new client.Gauge({ 74 | name: "points_to_next_coupon", 75 | help: "Points to next coupon" 76 | }); 77 | 78 | const trainPosition = new client.Gauge({ 79 | name: "train_position", 80 | help: "Train position", 81 | labelNames: ["train", "axis"] 82 | }); 83 | 84 | async function doPowerGrid() { 85 | const powerGrid = await execute(getPower); 86 | if (powerGrid.length < 1) return; 87 | 88 | // Pick the most active power grid 89 | const mainGrid = powerGrid.reduce((acc, cur) => { 90 | if (cur.powerProduced > acc.powerProduced) return cur; 91 | return acc; 92 | }); 93 | 94 | powerConsumed.set(mainGrid.powerConsumed); 95 | powerProduced.set(mainGrid.powerProduced); 96 | powerProductionCapacity.set(mainGrid.powerProductionCapacity); 97 | maximumPowerConsumption.set(mainGrid.maximumPowerConsumption); 98 | batteryPowerInput.set(mainGrid.batteryPowerInput); 99 | } 100 | 101 | async function doDepots() { 102 | const depots = await execute(getDepots); 103 | for (const [item, count] of Object.entries(depots)) { 104 | depotItem.labels({ item }).set(count); 105 | } 106 | } 107 | 108 | async function doSink() { 109 | const sink = await execute(getSink); 110 | coupons.set(sink.coupons); 111 | pointsToNextCoupon.set(sink.pointsToNextCoupon); 112 | } 113 | 114 | async function doTrains() { 115 | const trains = await execute(getTrains); 116 | for (const train of trains) { 117 | // I feel like this is the wrong way of doing this 118 | trainPosition.labels({ train: train.name, axis: "x" }).set(train.x); 119 | trainPosition.labels({ train: train.name, axis: "y" }).set(train.y); 120 | trainPosition.labels({ train: train.name, axis: "z" }).set(train.z); 121 | } 122 | } 123 | 124 | async function run() { 125 | const funcs = [doPowerGrid, doDepots, doSink, doTrains]; 126 | for (const func of funcs) { 127 | try { 128 | await func(); 129 | } catch (e) { 130 | console.error(e); 131 | } 132 | } 133 | } 134 | 135 | const job = new CronJob( 136 | // Every 5 seconds on the clock 137 | "*/5 * * * * *", 138 | async () => { 139 | try { 140 | await run(); 141 | } catch (e) { 142 | console.error(e); 143 | } 144 | }, 145 | null, // on complete 146 | false, // start instantly 147 | process.env.TZ ?? "America/New_York" 148 | ); 149 | 150 | process.on("SIGINT", () => { 151 | job.stop(); 152 | process.exit(); 153 | }); 154 | 155 | job.start(); 156 | -------------------------------------------------------------------------------- /grafana/data/max.json: -------------------------------------------------------------------------------- 1 | { 2 | "Uranium Waste": 2500, 3 | "Plutonium Waste": 2500, 4 | "Steel Beam": 1000, 5 | "Iron Plate": 1000, 6 | "Concrete": 2500, 7 | "Silica": 1000, 8 | "Limestone": 500, 9 | "Raw Quartz": 500, 10 | "Rotor": 500, 11 | "Modular Frame": 250, 12 | "Iron Rod": 1000, 13 | "Screw": 2500, 14 | "Wire": 2500, 15 | "Turbo Motor": 250, 16 | "Somersloop": 250, 17 | "Mercer Sphere": 250, 18 | "Supercomputer": 250, 19 | "Computer": 250, 20 | "Crystal Oscillator": 500, 21 | "Motor": 250, 22 | "Beryl Nut": 500, 23 | "Paleberry": 250, 24 | "Bacon Agaric": 250, 25 | "Water": 250000, 26 | "Object Scanner": 5, 27 | "Crude Oil": 250000, 28 | "Purple Power Slug": 250, 29 | "Yellow Power Slug": 250, 30 | "Blue Power Slug": 250, 31 | "Nitrogen Gas": 250000, 32 | "SAM": 500, 33 | "Encased Industrial Beam": 500, 34 | "Rubber": 1000, 35 | "Copper Ore": 500, 36 | "Iron Ore": 500, 37 | "Caterium Ore": 500, 38 | "Bauxite": 500, 39 | "Sulfur": 500, 40 | "Uranium": 500, 41 | "Coal": 500, 42 | "Iodine-Infused Filter": 250, 43 | "Portable Miner": 250, 44 | "Hazmat Suit": 5, 45 | "Factory Cart™": 5, 46 | "Golden Factory Cart™": 5, 47 | "Iron Rebar": 500, 48 | "Rebar Gun": 5, 49 | "Stun Rebar": 500, 50 | "Explosive Rebar": 500, 51 | "Shatter Rebar": 500, 52 | "Homing Rifle Ammo": 2500, 53 | "Rifle": 5, 54 | "Rifle Ammo": 2500, 55 | "Turbo Rifle Ammo": 2500, 56 | "Cable": 1000, 57 | "Power Shard": 500, 58 | "Medicinal Inhaler": 250, 59 | "Reinforced Iron Plate": 500, 60 | "Fused Modular Frame": 250, 61 | "Superposition Oscillator": 500, 62 | "Wood": 1000, 63 | "Leaves": 2500, 64 | "Xeno-Zapper": 5, 65 | "Iron Ingot": 500, 66 | "Copper Sheet": 1000, 67 | "Alclad Aluminum Sheet": 1000, 68 | "Time Crystal": 1000, 69 | "Excited Photonic Matter": 250000, 70 | "Ficsite Trigon": 1000, 71 | "Dark Matter Residue": 250000, 72 | "Cooling System": 500, 73 | "Diamonds": 1000, 74 | "Reanimated SAM": 500, 75 | "Neural-Quantum Processor": 500, 76 | "Dark Matter Crystal": 1000, 77 | "Magnetic Field Generator": 250, 78 | "AI Expansion Server": 250, 79 | "Ficsite Ingot": 500, 80 | "Steel Pipe": 1000, 81 | "Assembly Director System": 250, 82 | "Radio Control Unit": 250, 83 | "Aluminum Ingot": 500, 84 | "Biochemical Sculptor": 250, 85 | "SAM Fluctuator": 500, 86 | "Caterium Ingot": 500, 87 | "Petroleum Coke": 1000, 88 | "Quartz Crystal": 1000, 89 | "Fuel": 250000, 90 | "Turbofuel": 250000, 91 | "Packaged Turbofuel": 500, 92 | "Packaged Fuel": 500, 93 | "Heavy Oil Residue": 250000, 94 | "Empty Canister": 500, 95 | "Compacted Coal": 500, 96 | "Plastic": 1000, 97 | "Biomass": 1000, 98 | "Circuit Board": 1000, 99 | "Polymer Resin": 1000, 100 | "Empty Fluid Tank": 500, 101 | "Packaged Ionized Fuel": 500, 102 | "Ionized Fuel": 250000, 103 | "Rocket Fuel": 250000, 104 | "Packaged Rocket Fuel": 500, 105 | "Nitric Acid": 250000, 106 | "Smart Plating": 250, 107 | "Copper Ingot": 500, 108 | "Packaged Heavy Oil Residue": 500, 109 | "Packaged Water": 500, 110 | "Liquid Biofuel": 250000, 111 | "Packaged Liquid Biofuel": 500, 112 | "Solid Biofuel": 1000, 113 | "Packaged Oil": 500, 114 | "Steel Ingot": 500, 115 | "Versatile Framework": 250, 116 | "Alumina Solution": 250000, 117 | "Heavy Modular Frame": 250, 118 | "Aluminum Scrap": 2500, 119 | "Aluminum Casing": 1000, 120 | "Packaged Alumina Solution": 500, 121 | "Modular Engine": 250, 122 | "Automated Wiring": 250, 123 | "Adaptive Control Unit": 250, 124 | "High-Speed Connector": 500, 125 | "Stator": 500, 126 | "AI Limiter": 500, 127 | "Quickwire": 2500, 128 | "Heat Sink": 500, 129 | "Battery": 1000, 130 | "Packaged Sulfuric Acid": 500, 131 | "Sulfuric Acid": 250000, 132 | "Encased Uranium Cell": 1000, 133 | "Non-Fissile Uranium": 2500, 134 | "Packaged Nitrogen Gas": 500, 135 | "Uranium Fuel Rod": 250, 136 | "Electromagnetic Control Rod": 500, 137 | "Pressure Conversion Cube": 250, 138 | "Plutonium Pellet": 500, 139 | "Packaged Nitric Acid": 500, 140 | "Nuclear Pasta": 250, 141 | "Plutonium Fuel Rod": 250, 142 | "Encased Plutonium Cell": 1000, 143 | "Copper Powder": 2500, 144 | "Dissolved Silica": 250000, 145 | "Black Powder": 1000, 146 | "Thermal Propulsion Rocket": 250, 147 | "Alien Protein": 500, 148 | "Hog Remains": 250, 149 | "Spitter Remains": 250, 150 | "Mycelia": 1000, 151 | "Chainsaw": 5, 152 | "Xeno-Basher": 5, 153 | "Jetpack": 5, 154 | "Gas Filter": 250, 155 | "Fabric": 500, 156 | "Hoverpack": 5, 157 | "Ballistic Warp Drive": 250, 158 | "Singularity Cell": 250, 159 | "Ficsonium Fuel Rod": 250, 160 | "Ficsonium": 500, 161 | "Alien DNA Capsule": 250, 162 | "Hatcher Remains": 250, 163 | "Stinger Remains": 250, 164 | "Zipline": 5, 165 | "Blade Runners": 5, 166 | "Parachute": 5, 167 | "Nobelisk Detonator": 5, 168 | "Nobelisk": 250, 169 | "Pulse Nobelisk": 250, 170 | "Cluster Nobelisk": 250, 171 | "Nuke Nobelisk": 250, 172 | "Gas Nobelisk": 250, 173 | "Gas Mask": 5, 174 | "Smokeless Powder": 500 175 | } 176 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | 6 | end_of_line = lf 7 | insert_final_newline = true 8 | 9 | indent_style = space 10 | indent_size = 4 11 | trim_trailing_whitespace = true 12 | 13 | csharp_indent_braces = false 14 | csharp_new_line_before_catch = false 15 | csharp_new_line_before_else = false 16 | csharp_new_line_before_finally = false 17 | csharp_new_line_before_members_in_object_initializers = false 18 | csharp_new_line_before_open_brace = none 19 | csharp_preferred_modifier_order = public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async, file, required:suggestion 20 | csharp_style_prefer_utf8_string_literals = true:suggestion 21 | csharp_style_var_elsewhere = true:suggestion 22 | csharp_style_var_for_built_in_types = true:suggestion 23 | csharp_style_var_when_type_is_apparent = true:suggestion 24 | csharp_space_between_method_call_empty_parameter_list_parentheses = false 25 | csharp_space_between_method_call_parameter_list_parentheses = false 26 | csharp_space_between_method_declaration_empty_parameter_list_parentheses = false 27 | csharp_space_between_empty_square_brackets = false 28 | csharp_space_before_semicolon_in_for_statement = false 29 | csharp_space_before_open_square_brackets = false 30 | csharp_space_before_comma = false 31 | csharp_space_after_keywords_in_control_flow_statements = true 32 | csharp_space_after_comma = true 33 | csharp_space_after_cast = true 34 | csharp_space_around_binary_operators = before_and_after 35 | csharp_space_between_method_declaration_name_and_open_parenthesis = false 36 | csharp_space_between_method_declaration_parameter_list_parentheses = false 37 | csharp_space_between_square_brackets = false 38 | dotnet_code_quality_unused_parameters = non_public 39 | dotnet_naming_rule.event_rule.import_to_resharper = as_predefined 40 | dotnet_naming_rule.event_rule.severity = warning 41 | dotnet_naming_rule.event_rule.style = on_upper_camel_case_style 42 | dotnet_naming_rule.event_rule.symbols = event_symbols 43 | dotnet_naming_rule.private_constants_rule.import_to_resharper = as_predefined 44 | dotnet_naming_rule.private_constants_rule.severity = warning 45 | dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style 46 | dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols 47 | dotnet_naming_rule.private_instance_fields_rule.import_to_resharper = as_predefined 48 | dotnet_naming_rule.private_instance_fields_rule.severity = warning 49 | dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style 50 | dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols 51 | dotnet_naming_rule.private_static_fields_rule.import_to_resharper = as_predefined 52 | dotnet_naming_rule.private_static_fields_rule.severity = warning 53 | dotnet_naming_rule.private_static_fields_rule.style = upper_camel_case_style 54 | dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols 55 | dotnet_naming_rule.private_static_readonly_rule.import_to_resharper = as_predefined 56 | dotnet_naming_rule.private_static_readonly_rule.severity = warning 57 | dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style 58 | dotnet_naming_rule.private_static_readonly_rule.symbols = private_static_readonly_symbols 59 | dotnet_naming_rule.unity_serialized_field_rule.import_to_resharper = True 60 | dotnet_naming_rule.unity_serialized_field_rule.resharper_description = Unity serialized field 61 | dotnet_naming_rule.unity_serialized_field_rule.resharper_guid = 5f0fdb63-c892-4d2c-9324-15c80b22a7ef 62 | dotnet_naming_rule.unity_serialized_field_rule.severity = warning 63 | dotnet_naming_rule.unity_serialized_field_rule.style = lower_camel_case_style 64 | dotnet_naming_rule.unity_serialized_field_rule.symbols = unity_serialized_field_symbols 65 | dotnet_naming_style.lower_camel_case_style.capitalization = camel_case 66 | dotnet_naming_style.on_upper_camel_case_style.capitalization = pascal_case 67 | dotnet_naming_style.on_upper_camel_case_style.required_prefix = On 68 | dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case 69 | dotnet_naming_symbols.event_symbols.applicable_accessibilities = * 70 | dotnet_naming_symbols.event_symbols.applicable_kinds = event 71 | dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private 72 | dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field 73 | dotnet_naming_symbols.private_constants_symbols.required_modifiers = const 74 | dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private 75 | dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field 76 | dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private 77 | dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field 78 | dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static 79 | dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private 80 | dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field 81 | dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = static, readonly 82 | dotnet_naming_symbols.unity_serialized_field_symbols.applicable_accessibilities = * 83 | dotnet_naming_symbols.unity_serialized_field_symbols.applicable_kinds = 84 | dotnet_naming_symbols.unity_serialized_field_symbols.resharper_applicable_kinds = unity_serialised_field 85 | dotnet_naming_symbols.unity_serialized_field_symbols.resharper_required_modifiers = instance 86 | dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion 87 | dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion 88 | dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion 89 | dotnet_style_predefined_type_for_member_access = true:suggestion 90 | dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion 91 | dotnet_style_parentheses_in_other_operators = always_for_clarity:silent 92 | dotnet_style_object_initializer = false 93 | dotnet_style_qualification_for_field = true:none 94 | dotnet_style_qualification_for_property = true:none 95 | dotnet_style_qualification_for_method = true:none 96 | dotnet_style_qualification_for_event = true:none 97 | 98 | # ReSharper properties 99 | resharper_align_linq_query = true 100 | resharper_align_multiline_argument = true 101 | resharper_align_multiline_calls_chain = true 102 | resharper_align_multiline_expression = true 103 | resharper_align_multiline_extends_list = true 104 | resharper_align_multiline_for_stmt = true 105 | resharper_align_multiline_parameter = true 106 | resharper_align_multiple_declaration = true 107 | resharper_align_multline_type_parameter_constrains = true 108 | resharper_align_multline_type_parameter_list = true 109 | resharper_apply_auto_detected_rules = false 110 | resharper_apply_on_completion = true 111 | resharper_auto_property_can_be_made_get_only_global_highlighting = none 112 | resharper_auto_property_can_be_made_get_only_local_highlighting = none 113 | resharper_autodetect_indent_settings = true 114 | resharper_blank_lines_after_block_statements = 0 115 | resharper_blank_lines_around_auto_property = 0 116 | resharper_blank_lines_around_property = 0 117 | resharper_blank_lines_around_single_line_type = 0 118 | resharper_blank_lines_around_type = 1 119 | resharper_braces_for_ifelse = required_for_multiline 120 | resharper_can_use_global_alias = false 121 | resharper_csharp_align_multiline_argument = false 122 | resharper_csharp_align_multiline_calls_chain = false 123 | resharper_csharp_align_multiline_parameter = true 124 | resharper_csharp_align_multiple_declaration = true 125 | resharper_csharp_blank_lines_around_field = 0 126 | resharper_csharp_blank_lines_around_type = 1 127 | resharper_csharp_empty_block_style = together_same_line 128 | resharper_csharp_int_align_comments = true 129 | resharper_csharp_naming_rule.private_constants = AaBb 130 | resharper_csharp_naming_rule.private_static_fields = AaBb 131 | resharper_csharp_naming_rule.private_static_readonly = AaBb 132 | resharper_csharp_new_line_before_while = true 133 | resharper_csharp_remove_spaces_on_blank_lines = true 134 | resharper_csharp_wrap_after_declaration_lpar = true 135 | resharper_csharp_wrap_before_declaration_rpar = true 136 | resharper_enforce_line_ending_style = true 137 | resharper_member_can_be_private_global_highlighting = none 138 | resharper_member_can_be_private_local_highlighting = none 139 | resharper_new_line_before_finally = false 140 | resharper_new_line_before_while = true 141 | resharper_place_accessorholder_attribute_on_same_line = if_owner_is_single_line 142 | resharper_place_accessor_attribute_on_same_line = if_owner_is_single_line 143 | resharper_place_field_attribute_on_same_line = if_owner_is_single_line 144 | resharper_place_method_attribute_on_same_line = if_owner_is_single_line 145 | resharper_show_autodetect_configure_formatting_tip = false 146 | resharper_space_within_single_line_array_initializer_braces = false 147 | resharper_use_indent_from_vs = false 148 | 149 | # ReSharper inspection severities 150 | resharper_arrange_missing_parentheses_highlighting = hint 151 | resharper_arrange_redundant_parentheses_highlighting = hint 152 | resharper_arrange_this_qualifier_highlighting = suggestion 153 | resharper_arrange_type_member_modifiers_highlighting = hint 154 | resharper_arrange_type_modifiers_highlighting = hint 155 | resharper_built_in_type_reference_style_for_member_access_highlighting = hint 156 | resharper_built_in_type_reference_style_highlighting = none 157 | resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting = none 158 | resharper_foreach_can_be_partly_converted_to_query_using_another_get_enumerator_highlighting = none 159 | resharper_invert_if_highlighting = none 160 | resharper_loop_can_be_converted_to_query_highlighting = none 161 | resharper_method_has_async_overload_highlighting = none 162 | resharper_private_field_can_be_converted_to_local_variable_highlighting = none 163 | resharper_redundant_base_qualifier_highlighting = none 164 | resharper_suggest_var_or_type_built_in_types_highlighting = hint 165 | resharper_suggest_var_or_type_elsewhere_highlighting = hint 166 | resharper_suggest_var_or_type_simple_types_highlighting = hint 167 | resharper_unused_auto_property_accessor_global_highlighting = none 168 | csharp_style_deconstructed_variable_declaration = true:silent 169 | resharper_web_config_module_not_resolved_highlighting = warning 170 | resharper_web_config_type_not_resolved_highlighting = warning 171 | resharper_web_config_wrong_module_highlighting = warning 172 | -------------------------------------------------------------------------------- /grafana/data/dashboard_template.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "builtIn": 1, 6 | "datasource": { 7 | "type": "grafana", 8 | "uid": "-- Grafana --" 9 | }, 10 | "enable": true, 11 | "hide": true, 12 | "iconColor": "rgba(0, 211, 255, 1)", 13 | "name": "Annotations & Alerts", 14 | "type": "dashboard" 15 | } 16 | ] 17 | }, 18 | "editable": true, 19 | "fiscalYearStartMonth": 0, 20 | "graphTooltip": 0, 21 | "id": 1, 22 | "links": [], 23 | "panels": [ 24 | { 25 | "datasource": { 26 | "default": true, 27 | "type": "prometheus", 28 | "uid": "adyhxpuakmrcwf" 29 | }, 30 | "fieldConfig": { 31 | "defaults": { 32 | "color": { 33 | "mode": "palette-classic" 34 | }, 35 | "custom": { 36 | "axisBorderShow": false, 37 | "axisCenteredZero": false, 38 | "axisColorMode": "text", 39 | "axisLabel": "", 40 | "axisPlacement": "auto", 41 | "barAlignment": 0, 42 | "barWidthFactor": 0.6, 43 | "drawStyle": "line", 44 | "fillOpacity": 0, 45 | "gradientMode": "none", 46 | "hideFrom": { 47 | "legend": false, 48 | "tooltip": false, 49 | "viz": false 50 | }, 51 | "insertNulls": false, 52 | "lineInterpolation": "linear", 53 | "lineWidth": 1, 54 | "pointSize": 5, 55 | "scaleDistribution": { 56 | "type": "linear" 57 | }, 58 | "showPoints": "auto", 59 | "spanNulls": false, 60 | "stacking": { 61 | "group": "A", 62 | "mode": "none" 63 | }, 64 | "thresholdsStyle": { 65 | "mode": "off" 66 | } 67 | }, 68 | "mappings": [], 69 | "thresholds": { 70 | "mode": "absolute", 71 | "steps": [ 72 | { 73 | "color": "green", 74 | "value": null 75 | }, 76 | { 77 | "color": "red", 78 | "value": 80 79 | } 80 | ] 81 | } 82 | }, 83 | "overrides": [] 84 | }, 85 | "gridPos": { 86 | "h": 13, 87 | "w": 10, 88 | "x": 0, 89 | "y": 0 90 | }, 91 | "id": 3, 92 | "options": { 93 | "legend": { 94 | "calcs": [], 95 | "displayMode": "list", 96 | "placement": "bottom", 97 | "showLegend": true 98 | }, 99 | "tooltip": { 100 | "mode": "single", 101 | "sort": "none" 102 | } 103 | }, 104 | "pluginVersion": "11.2.0", 105 | "targets": [ 106 | { 107 | "datasource": { 108 | "type": "prometheus", 109 | "uid": "adyhxpuakmrcwf" 110 | }, 111 | "disableTextWrap": false, 112 | "editorMode": "builder", 113 | "expr": "depot", 114 | "fullMetaSearch": false, 115 | "includeNullMetadata": true, 116 | "instant": false, 117 | "legendFormat": "{{item}}", 118 | "range": true, 119 | "refId": "A", 120 | "useBackend": false 121 | } 122 | ], 123 | "title": "Depots Over Time", 124 | "type": "timeseries" 125 | }, 126 | { 127 | "datasource": { 128 | "default": true, 129 | "type": "prometheus", 130 | "uid": "adyhxpuakmrcwf" 131 | }, 132 | "fieldConfig": { 133 | "defaults": { 134 | "color": { 135 | "mode": "continuous-RdYlGr" 136 | }, 137 | "mappings": [], 138 | "thresholds": { 139 | "mode": "percentage", 140 | "steps": [ 141 | { 142 | "color": "red", 143 | "value": null 144 | } 145 | ] 146 | } 147 | }, 148 | "overrides": [] 149 | }, 150 | "gridPos": { 151 | "h": 13, 152 | "w": 7, 153 | "x": 10, 154 | "y": 0 155 | }, 156 | "id": 1, 157 | "options": { 158 | "displayMode": "lcd", 159 | "maxVizHeight": 300, 160 | "minVizHeight": 16, 161 | "minVizWidth": 8, 162 | "namePlacement": "auto", 163 | "orientation": "horizontal", 164 | "reduceOptions": { 165 | "calcs": [ 166 | "lastNotNull" 167 | ], 168 | "fields": "", 169 | "values": false 170 | }, 171 | "showUnfilled": true, 172 | "sizing": "auto", 173 | "valueMode": "color" 174 | }, 175 | "pluginVersion": "11.2.0", 176 | "targets": [ 177 | { 178 | "datasource": { 179 | "type": "prometheus", 180 | "uid": "adyhxpuakmrcwf" 181 | }, 182 | "disableTextWrap": false, 183 | "editorMode": "builder", 184 | "exemplar": false, 185 | "expr": "sort_desc(depot)", 186 | "fullMetaSearch": false, 187 | "includeNullMetadata": true, 188 | "instant": true, 189 | "legendFormat": "{{item}}", 190 | "range": false, 191 | "refId": "A", 192 | "useBackend": false 193 | } 194 | ], 195 | "title": "Dimensional Depots", 196 | "type": "bargauge" 197 | }, 198 | { 199 | "datasource": { 200 | "default": true, 201 | "type": "prometheus", 202 | "uid": "adyhxpuakmrcwf" 203 | }, 204 | "fieldConfig": { 205 | "defaults": { 206 | "color": { 207 | "fixedColor": "#727273", 208 | "mode": "fixed" 209 | }, 210 | "custom": { 211 | "axisBorderShow": false, 212 | "axisCenteredZero": false, 213 | "axisColorMode": "text", 214 | "axisLabel": "", 215 | "axisPlacement": "auto", 216 | "barAlignment": 0, 217 | "barWidthFactor": 0.6, 218 | "drawStyle": "line", 219 | "fillOpacity": 0, 220 | "gradientMode": "none", 221 | "hideFrom": { 222 | "legend": false, 223 | "tooltip": false, 224 | "viz": false 225 | }, 226 | "insertNulls": false, 227 | "lineInterpolation": "linear", 228 | "lineWidth": 1, 229 | "pointSize": 5, 230 | "scaleDistribution": { 231 | "type": "linear" 232 | }, 233 | "showPoints": "auto", 234 | "spanNulls": false, 235 | "stacking": { 236 | "group": "A", 237 | "mode": "none" 238 | }, 239 | "thresholdsStyle": { 240 | "mode": "off" 241 | } 242 | }, 243 | "mappings": [], 244 | "min": 0, 245 | "thresholds": { 246 | "mode": "absolute", 247 | "steps": [ 248 | { 249 | "color": "green", 250 | "value": null 251 | } 252 | ] 253 | } 254 | }, 255 | "overrides": [ 256 | { 257 | "matcher": { 258 | "id": "byName", 259 | "options": "Points Per Minute" 260 | }, 261 | "properties": [ 262 | { 263 | "id": "color", 264 | "value": { 265 | "fixedColor": "#a779a7", 266 | "mode": "fixed" 267 | } 268 | } 269 | ] 270 | } 271 | ] 272 | }, 273 | "gridPos": { 274 | "h": 7, 275 | "w": 7, 276 | "x": 17, 277 | "y": 0 278 | }, 279 | "id": 4, 280 | "options": { 281 | "legend": { 282 | "calcs": [], 283 | "displayMode": "list", 284 | "placement": "bottom", 285 | "showLegend": true 286 | }, 287 | "tooltip": { 288 | "mode": "single", 289 | "sort": "none" 290 | } 291 | }, 292 | "targets": [ 293 | { 294 | "datasource": { 295 | "type": "prometheus", 296 | "uid": "adyhxpuakmrcwf" 297 | }, 298 | "disableTextWrap": false, 299 | "editorMode": "code", 300 | "expr": "(-1 * idelta(points_to_next_coupon[10s])) * 12", 301 | "fullMetaSearch": false, 302 | "includeNullMetadata": true, 303 | "instant": false, 304 | "interval": "", 305 | "legendFormat": "Points Per Minute", 306 | "range": true, 307 | "refId": "A", 308 | "useBackend": false 309 | }, 310 | { 311 | "datasource": { 312 | "type": "prometheus", 313 | "uid": "adyhxpuakmrcwf" 314 | }, 315 | "disableTextWrap": false, 316 | "editorMode": "builder", 317 | "expr": "points_to_next_coupon", 318 | "fullMetaSearch": false, 319 | "hide": false, 320 | "includeNullMetadata": true, 321 | "instant": false, 322 | "interval": "", 323 | "legendFormat": "Points Until Next Coupon", 324 | "range": true, 325 | "refId": "B", 326 | "useBackend": false 327 | } 328 | ], 329 | "title": "AWESOME Points", 330 | "type": "timeseries" 331 | }, 332 | { 333 | "datasource": { 334 | "default": true, 335 | "type": "prometheus", 336 | "uid": "adyhxpuakmrcwf" 337 | }, 338 | "fieldConfig": { 339 | "defaults": { 340 | "color": { 341 | "fixedColor": "#5dafc5", 342 | "mode": "fixed" 343 | }, 344 | "mappings": [], 345 | "thresholds": { 346 | "mode": "absolute", 347 | "steps": [ 348 | { 349 | "color": "green", 350 | "value": null 351 | } 352 | ] 353 | } 354 | }, 355 | "overrides": [] 356 | }, 357 | "gridPos": { 358 | "h": 6, 359 | "w": 7, 360 | "x": 17, 361 | "y": 7 362 | }, 363 | "id": 5, 364 | "options": { 365 | "colorMode": "value", 366 | "graphMode": "area", 367 | "justifyMode": "auto", 368 | "orientation": "auto", 369 | "percentChangeColorMode": "standard", 370 | "reduceOptions": { 371 | "calcs": [ 372 | "lastNotNull" 373 | ], 374 | "fields": "", 375 | "values": false 376 | }, 377 | "showPercentChange": false, 378 | "textMode": "auto", 379 | "wideLayout": true 380 | }, 381 | "pluginVersion": "11.2.0", 382 | "targets": [ 383 | { 384 | "datasource": { 385 | "type": "prometheus", 386 | "uid": "adyhxpuakmrcwf" 387 | }, 388 | "disableTextWrap": false, 389 | "editorMode": "code", 390 | "expr": "coupons + ignoring(item) depot{item=\"FICSIT Coupon\"}", 391 | "fullMetaSearch": false, 392 | "hide": false, 393 | "includeNullMetadata": true, 394 | "instant": false, 395 | "legendFormat": "Total", 396 | "range": true, 397 | "refId": "A", 398 | "useBackend": false 399 | }, 400 | { 401 | "datasource": { 402 | "type": "prometheus", 403 | "uid": "adyhxpuakmrcwf" 404 | }, 405 | "disableTextWrap": false, 406 | "editorMode": "builder", 407 | "exemplar": false, 408 | "expr": "coupons", 409 | "format": "time_series", 410 | "fullMetaSearch": false, 411 | "hide": false, 412 | "includeNullMetadata": true, 413 | "instant": false, 414 | "legendFormat": "Pending", 415 | "range": true, 416 | "refId": "B", 417 | "useBackend": false 418 | } 419 | ], 420 | "title": "FICSIT Coupons", 421 | "type": "stat" 422 | }, 423 | { 424 | "datasource": { 425 | "default": true, 426 | "type": "prometheus", 427 | "uid": "adyhxpuakmrcwf" 428 | }, 429 | "fieldConfig": { 430 | "defaults": { 431 | "color": { 432 | "mode": "palette-classic" 433 | }, 434 | "custom": { 435 | "axisBorderShow": false, 436 | "axisCenteredZero": false, 437 | "axisColorMode": "text", 438 | "axisLabel": "", 439 | "axisPlacement": "auto", 440 | "barAlignment": 0, 441 | "barWidthFactor": 0.6, 442 | "drawStyle": "line", 443 | "fillOpacity": 0, 444 | "gradientMode": "none", 445 | "hideFrom": { 446 | "legend": false, 447 | "tooltip": false, 448 | "viz": false 449 | }, 450 | "insertNulls": false, 451 | "lineInterpolation": "linear", 452 | "lineWidth": 1, 453 | "pointSize": 5, 454 | "scaleDistribution": { 455 | "type": "linear" 456 | }, 457 | "showPoints": "auto", 458 | "spanNulls": false, 459 | "stacking": { 460 | "group": "A", 461 | "mode": "none" 462 | }, 463 | "thresholdsStyle": { 464 | "mode": "off" 465 | } 466 | }, 467 | "mappings": [], 468 | "min": 0, 469 | "thresholds": { 470 | "mode": "absolute", 471 | "steps": [ 472 | { 473 | "color": "#727273", 474 | "value": null 475 | } 476 | ] 477 | } 478 | }, 479 | "overrides": [ 480 | { 481 | "matcher": { 482 | "id": "byName", 483 | "options": "Power Produced" 484 | }, 485 | "properties": [ 486 | { 487 | "id": "color", 488 | "value": { 489 | "fixedColor": "#727273", 490 | "mode": "fixed" 491 | } 492 | } 493 | ] 494 | }, 495 | { 496 | "matcher": { 497 | "id": "byName", 498 | "options": "Power Consumed" 499 | }, 500 | "properties": [ 501 | { 502 | "id": "color", 503 | "value": { 504 | "fixedColor": "#e59344", 505 | "mode": "fixed" 506 | } 507 | } 508 | ] 509 | }, 510 | { 511 | "matcher": { 512 | "id": "byName", 513 | "options": "Max Consumption" 514 | }, 515 | "properties": [ 516 | { 517 | "id": "color", 518 | "value": { 519 | "fixedColor": "#5cb0c5", 520 | "mode": "fixed" 521 | } 522 | } 523 | ] 524 | }, 525 | { 526 | "matcher": { 527 | "id": "byName", 528 | "options": "Power Capacity" 529 | }, 530 | "properties": [ 531 | { 532 | "id": "color", 533 | "value": { 534 | "fixedColor": "#cfcece", 535 | "mode": "fixed" 536 | } 537 | } 538 | ] 539 | } 540 | ] 541 | }, 542 | "gridPos": { 543 | "h": 9, 544 | "w": 24, 545 | "x": 0, 546 | "y": 13 547 | }, 548 | "id": 2, 549 | "options": { 550 | "legend": { 551 | "calcs": [], 552 | "displayMode": "list", 553 | "placement": "bottom", 554 | "showLegend": true 555 | }, 556 | "tooltip": { 557 | "mode": "single", 558 | "sort": "none" 559 | } 560 | }, 561 | "targets": [ 562 | { 563 | "datasource": { 564 | "type": "prometheus", 565 | "uid": "adyhxpuakmrcwf" 566 | }, 567 | "disableTextWrap": false, 568 | "editorMode": "builder", 569 | "expr": "power_produced", 570 | "fullMetaSearch": false, 571 | "includeNullMetadata": true, 572 | "instant": false, 573 | "legendFormat": "Power Produced", 574 | "range": true, 575 | "refId": "Power Produced", 576 | "useBackend": false 577 | }, 578 | { 579 | "datasource": { 580 | "type": "prometheus", 581 | "uid": "adyhxpuakmrcwf" 582 | }, 583 | "disableTextWrap": false, 584 | "editorMode": "builder", 585 | "expr": "power_consumed", 586 | "fullMetaSearch": false, 587 | "hide": false, 588 | "includeNullMetadata": true, 589 | "instant": false, 590 | "legendFormat": "Power Consumed", 591 | "range": true, 592 | "refId": "Power Consumed", 593 | "useBackend": false 594 | }, 595 | { 596 | "datasource": { 597 | "type": "prometheus", 598 | "uid": "adyhxpuakmrcwf" 599 | }, 600 | "disableTextWrap": false, 601 | "editorMode": "builder", 602 | "expr": "maximum_power_consumption", 603 | "fullMetaSearch": false, 604 | "hide": false, 605 | "includeNullMetadata": true, 606 | "instant": false, 607 | "legendFormat": "Max Consumption", 608 | "range": true, 609 | "refId": "Max Consumption", 610 | "useBackend": false 611 | }, 612 | { 613 | "datasource": { 614 | "type": "prometheus", 615 | "uid": "adyhxpuakmrcwf" 616 | }, 617 | "disableTextWrap": false, 618 | "editorMode": "builder", 619 | "expr": "power_production_capacity", 620 | "fullMetaSearch": false, 621 | "hide": false, 622 | "includeNullMetadata": true, 623 | "instant": false, 624 | "legendFormat": "Power Capacity", 625 | "range": true, 626 | "refId": "Power Capacity", 627 | "useBackend": false 628 | } 629 | ], 630 | "title": "Power Consumption", 631 | "type": "timeseries" 632 | } 633 | ], 634 | "refresh": "5s", 635 | "schemaVersion": 39, 636 | "tags": [], 637 | "templating": { 638 | "list": [] 639 | }, 640 | "time": { 641 | "from": "now-6h", 642 | "to": "now" 643 | }, 644 | "timepicker": {}, 645 | "timezone": "browser", 646 | "title": "Statisfactory", 647 | "uid": "fdyhzb7pkn7y8b", 648 | "version": 24, 649 | "weekStart": "" 650 | } 651 | -------------------------------------------------------------------------------- /scraper/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "statisfactory", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "statisfactory", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "cron": "^3.1.7", 12 | "dotenv": "^16.4.5", 13 | "express": "^4.19.2", 14 | "prom-client": "^15.1.3" 15 | } 16 | }, 17 | "node_modules/@opentelemetry/api": { 18 | "version": "1.9.0", 19 | "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", 20 | "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", 21 | "license": "Apache-2.0", 22 | "engines": { 23 | "node": ">=8.0.0" 24 | } 25 | }, 26 | "node_modules/@types/luxon": { 27 | "version": "3.4.2", 28 | "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", 29 | "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", 30 | "license": "MIT" 31 | }, 32 | "node_modules/accepts": { 33 | "version": "1.3.8", 34 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 35 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 36 | "license": "MIT", 37 | "dependencies": { 38 | "mime-types": "~2.1.34", 39 | "negotiator": "0.6.3" 40 | }, 41 | "engines": { 42 | "node": ">= 0.6" 43 | } 44 | }, 45 | "node_modules/array-flatten": { 46 | "version": "1.1.1", 47 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 48 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 49 | "license": "MIT" 50 | }, 51 | "node_modules/bintrees": { 52 | "version": "1.0.2", 53 | "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", 54 | "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", 55 | "license": "MIT" 56 | }, 57 | "node_modules/body-parser": { 58 | "version": "1.20.3", 59 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 60 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 61 | "license": "MIT", 62 | "dependencies": { 63 | "bytes": "3.1.2", 64 | "content-type": "~1.0.5", 65 | "debug": "2.6.9", 66 | "depd": "2.0.0", 67 | "destroy": "1.2.0", 68 | "http-errors": "2.0.0", 69 | "iconv-lite": "0.4.24", 70 | "on-finished": "2.4.1", 71 | "qs": "6.13.0", 72 | "raw-body": "2.5.2", 73 | "type-is": "~1.6.18", 74 | "unpipe": "1.0.0" 75 | }, 76 | "engines": { 77 | "node": ">= 0.8", 78 | "npm": "1.2.8000 || >= 1.4.16" 79 | } 80 | }, 81 | "node_modules/bytes": { 82 | "version": "3.1.2", 83 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 84 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 85 | "license": "MIT", 86 | "engines": { 87 | "node": ">= 0.8" 88 | } 89 | }, 90 | "node_modules/call-bind": { 91 | "version": "1.0.7", 92 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 93 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 94 | "license": "MIT", 95 | "dependencies": { 96 | "es-define-property": "^1.0.0", 97 | "es-errors": "^1.3.0", 98 | "function-bind": "^1.1.2", 99 | "get-intrinsic": "^1.2.4", 100 | "set-function-length": "^1.2.1" 101 | }, 102 | "engines": { 103 | "node": ">= 0.4" 104 | }, 105 | "funding": { 106 | "url": "https://github.com/sponsors/ljharb" 107 | } 108 | }, 109 | "node_modules/content-disposition": { 110 | "version": "0.5.4", 111 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 112 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 113 | "license": "MIT", 114 | "dependencies": { 115 | "safe-buffer": "5.2.1" 116 | }, 117 | "engines": { 118 | "node": ">= 0.6" 119 | } 120 | }, 121 | "node_modules/content-type": { 122 | "version": "1.0.5", 123 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 124 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 125 | "license": "MIT", 126 | "engines": { 127 | "node": ">= 0.6" 128 | } 129 | }, 130 | "node_modules/cookie": { 131 | "version": "0.6.0", 132 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 133 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 134 | "license": "MIT", 135 | "engines": { 136 | "node": ">= 0.6" 137 | } 138 | }, 139 | "node_modules/cookie-signature": { 140 | "version": "1.0.6", 141 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 142 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 143 | "license": "MIT" 144 | }, 145 | "node_modules/cron": { 146 | "version": "3.1.7", 147 | "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.7.tgz", 148 | "integrity": "sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw==", 149 | "license": "MIT", 150 | "dependencies": { 151 | "@types/luxon": "~3.4.0", 152 | "luxon": "~3.4.0" 153 | } 154 | }, 155 | "node_modules/debug": { 156 | "version": "2.6.9", 157 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 158 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 159 | "license": "MIT", 160 | "dependencies": { 161 | "ms": "2.0.0" 162 | } 163 | }, 164 | "node_modules/define-data-property": { 165 | "version": "1.1.4", 166 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 167 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 168 | "license": "MIT", 169 | "dependencies": { 170 | "es-define-property": "^1.0.0", 171 | "es-errors": "^1.3.0", 172 | "gopd": "^1.0.1" 173 | }, 174 | "engines": { 175 | "node": ">= 0.4" 176 | }, 177 | "funding": { 178 | "url": "https://github.com/sponsors/ljharb" 179 | } 180 | }, 181 | "node_modules/depd": { 182 | "version": "2.0.0", 183 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 184 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 185 | "license": "MIT", 186 | "engines": { 187 | "node": ">= 0.8" 188 | } 189 | }, 190 | "node_modules/destroy": { 191 | "version": "1.2.0", 192 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 193 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 194 | "license": "MIT", 195 | "engines": { 196 | "node": ">= 0.8", 197 | "npm": "1.2.8000 || >= 1.4.16" 198 | } 199 | }, 200 | "node_modules/dotenv": { 201 | "version": "16.4.5", 202 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 203 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 204 | "license": "BSD-2-Clause", 205 | "engines": { 206 | "node": ">=12" 207 | }, 208 | "funding": { 209 | "url": "https://dotenvx.com" 210 | } 211 | }, 212 | "node_modules/ee-first": { 213 | "version": "1.1.1", 214 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 215 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 216 | "license": "MIT" 217 | }, 218 | "node_modules/encodeurl": { 219 | "version": "2.0.0", 220 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 221 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 222 | "license": "MIT", 223 | "engines": { 224 | "node": ">= 0.8" 225 | } 226 | }, 227 | "node_modules/es-define-property": { 228 | "version": "1.0.0", 229 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 230 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 231 | "license": "MIT", 232 | "dependencies": { 233 | "get-intrinsic": "^1.2.4" 234 | }, 235 | "engines": { 236 | "node": ">= 0.4" 237 | } 238 | }, 239 | "node_modules/es-errors": { 240 | "version": "1.3.0", 241 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 242 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 243 | "license": "MIT", 244 | "engines": { 245 | "node": ">= 0.4" 246 | } 247 | }, 248 | "node_modules/escape-html": { 249 | "version": "1.0.3", 250 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 251 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 252 | "license": "MIT" 253 | }, 254 | "node_modules/etag": { 255 | "version": "1.8.1", 256 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 257 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 258 | "license": "MIT", 259 | "engines": { 260 | "node": ">= 0.6" 261 | } 262 | }, 263 | "node_modules/express": { 264 | "version": "4.21.0", 265 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", 266 | "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", 267 | "license": "MIT", 268 | "dependencies": { 269 | "accepts": "~1.3.8", 270 | "array-flatten": "1.1.1", 271 | "body-parser": "1.20.3", 272 | "content-disposition": "0.5.4", 273 | "content-type": "~1.0.4", 274 | "cookie": "0.6.0", 275 | "cookie-signature": "1.0.6", 276 | "debug": "2.6.9", 277 | "depd": "2.0.0", 278 | "encodeurl": "~2.0.0", 279 | "escape-html": "~1.0.3", 280 | "etag": "~1.8.1", 281 | "finalhandler": "1.3.1", 282 | "fresh": "0.5.2", 283 | "http-errors": "2.0.0", 284 | "merge-descriptors": "1.0.3", 285 | "methods": "~1.1.2", 286 | "on-finished": "2.4.1", 287 | "parseurl": "~1.3.3", 288 | "path-to-regexp": "0.1.10", 289 | "proxy-addr": "~2.0.7", 290 | "qs": "6.13.0", 291 | "range-parser": "~1.2.1", 292 | "safe-buffer": "5.2.1", 293 | "send": "0.19.0", 294 | "serve-static": "1.16.2", 295 | "setprototypeof": "1.2.0", 296 | "statuses": "2.0.1", 297 | "type-is": "~1.6.18", 298 | "utils-merge": "1.0.1", 299 | "vary": "~1.1.2" 300 | }, 301 | "engines": { 302 | "node": ">= 0.10.0" 303 | } 304 | }, 305 | "node_modules/finalhandler": { 306 | "version": "1.3.1", 307 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 308 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 309 | "license": "MIT", 310 | "dependencies": { 311 | "debug": "2.6.9", 312 | "encodeurl": "~2.0.0", 313 | "escape-html": "~1.0.3", 314 | "on-finished": "2.4.1", 315 | "parseurl": "~1.3.3", 316 | "statuses": "2.0.1", 317 | "unpipe": "~1.0.0" 318 | }, 319 | "engines": { 320 | "node": ">= 0.8" 321 | } 322 | }, 323 | "node_modules/forwarded": { 324 | "version": "0.2.0", 325 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 326 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 327 | "license": "MIT", 328 | "engines": { 329 | "node": ">= 0.6" 330 | } 331 | }, 332 | "node_modules/fresh": { 333 | "version": "0.5.2", 334 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 335 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 336 | "license": "MIT", 337 | "engines": { 338 | "node": ">= 0.6" 339 | } 340 | }, 341 | "node_modules/function-bind": { 342 | "version": "1.1.2", 343 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 344 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 345 | "license": "MIT", 346 | "funding": { 347 | "url": "https://github.com/sponsors/ljharb" 348 | } 349 | }, 350 | "node_modules/get-intrinsic": { 351 | "version": "1.2.4", 352 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 353 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 354 | "license": "MIT", 355 | "dependencies": { 356 | "es-errors": "^1.3.0", 357 | "function-bind": "^1.1.2", 358 | "has-proto": "^1.0.1", 359 | "has-symbols": "^1.0.3", 360 | "hasown": "^2.0.0" 361 | }, 362 | "engines": { 363 | "node": ">= 0.4" 364 | }, 365 | "funding": { 366 | "url": "https://github.com/sponsors/ljharb" 367 | } 368 | }, 369 | "node_modules/gopd": { 370 | "version": "1.0.1", 371 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 372 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 373 | "license": "MIT", 374 | "dependencies": { 375 | "get-intrinsic": "^1.1.3" 376 | }, 377 | "funding": { 378 | "url": "https://github.com/sponsors/ljharb" 379 | } 380 | }, 381 | "node_modules/has-property-descriptors": { 382 | "version": "1.0.2", 383 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 384 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 385 | "license": "MIT", 386 | "dependencies": { 387 | "es-define-property": "^1.0.0" 388 | }, 389 | "funding": { 390 | "url": "https://github.com/sponsors/ljharb" 391 | } 392 | }, 393 | "node_modules/has-proto": { 394 | "version": "1.0.3", 395 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 396 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 397 | "license": "MIT", 398 | "engines": { 399 | "node": ">= 0.4" 400 | }, 401 | "funding": { 402 | "url": "https://github.com/sponsors/ljharb" 403 | } 404 | }, 405 | "node_modules/has-symbols": { 406 | "version": "1.0.3", 407 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 408 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 409 | "license": "MIT", 410 | "engines": { 411 | "node": ">= 0.4" 412 | }, 413 | "funding": { 414 | "url": "https://github.com/sponsors/ljharb" 415 | } 416 | }, 417 | "node_modules/hasown": { 418 | "version": "2.0.2", 419 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 420 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 421 | "license": "MIT", 422 | "dependencies": { 423 | "function-bind": "^1.1.2" 424 | }, 425 | "engines": { 426 | "node": ">= 0.4" 427 | } 428 | }, 429 | "node_modules/http-errors": { 430 | "version": "2.0.0", 431 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 432 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 433 | "license": "MIT", 434 | "dependencies": { 435 | "depd": "2.0.0", 436 | "inherits": "2.0.4", 437 | "setprototypeof": "1.2.0", 438 | "statuses": "2.0.1", 439 | "toidentifier": "1.0.1" 440 | }, 441 | "engines": { 442 | "node": ">= 0.8" 443 | } 444 | }, 445 | "node_modules/iconv-lite": { 446 | "version": "0.4.24", 447 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 448 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 449 | "license": "MIT", 450 | "dependencies": { 451 | "safer-buffer": ">= 2.1.2 < 3" 452 | }, 453 | "engines": { 454 | "node": ">=0.10.0" 455 | } 456 | }, 457 | "node_modules/inherits": { 458 | "version": "2.0.4", 459 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 460 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 461 | "license": "ISC" 462 | }, 463 | "node_modules/ipaddr.js": { 464 | "version": "1.9.1", 465 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 466 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 467 | "license": "MIT", 468 | "engines": { 469 | "node": ">= 0.10" 470 | } 471 | }, 472 | "node_modules/luxon": { 473 | "version": "3.4.4", 474 | "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", 475 | "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", 476 | "license": "MIT", 477 | "engines": { 478 | "node": ">=12" 479 | } 480 | }, 481 | "node_modules/media-typer": { 482 | "version": "0.3.0", 483 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 484 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 485 | "license": "MIT", 486 | "engines": { 487 | "node": ">= 0.6" 488 | } 489 | }, 490 | "node_modules/merge-descriptors": { 491 | "version": "1.0.3", 492 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 493 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 494 | "license": "MIT", 495 | "funding": { 496 | "url": "https://github.com/sponsors/sindresorhus" 497 | } 498 | }, 499 | "node_modules/methods": { 500 | "version": "1.1.2", 501 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 502 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 503 | "license": "MIT", 504 | "engines": { 505 | "node": ">= 0.6" 506 | } 507 | }, 508 | "node_modules/mime": { 509 | "version": "1.6.0", 510 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 511 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 512 | "license": "MIT", 513 | "bin": { 514 | "mime": "cli.js" 515 | }, 516 | "engines": { 517 | "node": ">=4" 518 | } 519 | }, 520 | "node_modules/mime-db": { 521 | "version": "1.52.0", 522 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 523 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 524 | "license": "MIT", 525 | "engines": { 526 | "node": ">= 0.6" 527 | } 528 | }, 529 | "node_modules/mime-types": { 530 | "version": "2.1.35", 531 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 532 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 533 | "license": "MIT", 534 | "dependencies": { 535 | "mime-db": "1.52.0" 536 | }, 537 | "engines": { 538 | "node": ">= 0.6" 539 | } 540 | }, 541 | "node_modules/ms": { 542 | "version": "2.0.0", 543 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 544 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 545 | "license": "MIT" 546 | }, 547 | "node_modules/negotiator": { 548 | "version": "0.6.3", 549 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 550 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 551 | "license": "MIT", 552 | "engines": { 553 | "node": ">= 0.6" 554 | } 555 | }, 556 | "node_modules/object-inspect": { 557 | "version": "1.13.2", 558 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 559 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 560 | "license": "MIT", 561 | "engines": { 562 | "node": ">= 0.4" 563 | }, 564 | "funding": { 565 | "url": "https://github.com/sponsors/ljharb" 566 | } 567 | }, 568 | "node_modules/on-finished": { 569 | "version": "2.4.1", 570 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 571 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 572 | "license": "MIT", 573 | "dependencies": { 574 | "ee-first": "1.1.1" 575 | }, 576 | "engines": { 577 | "node": ">= 0.8" 578 | } 579 | }, 580 | "node_modules/parseurl": { 581 | "version": "1.3.3", 582 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 583 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 584 | "license": "MIT", 585 | "engines": { 586 | "node": ">= 0.8" 587 | } 588 | }, 589 | "node_modules/path-to-regexp": { 590 | "version": "0.1.10", 591 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", 592 | "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", 593 | "license": "MIT" 594 | }, 595 | "node_modules/prom-client": { 596 | "version": "15.1.3", 597 | "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.3.tgz", 598 | "integrity": "sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==", 599 | "license": "Apache-2.0", 600 | "dependencies": { 601 | "@opentelemetry/api": "^1.4.0", 602 | "tdigest": "^0.1.1" 603 | }, 604 | "engines": { 605 | "node": "^16 || ^18 || >=20" 606 | } 607 | }, 608 | "node_modules/proxy-addr": { 609 | "version": "2.0.7", 610 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 611 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 612 | "license": "MIT", 613 | "dependencies": { 614 | "forwarded": "0.2.0", 615 | "ipaddr.js": "1.9.1" 616 | }, 617 | "engines": { 618 | "node": ">= 0.10" 619 | } 620 | }, 621 | "node_modules/qs": { 622 | "version": "6.13.0", 623 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 624 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 625 | "license": "BSD-3-Clause", 626 | "dependencies": { 627 | "side-channel": "^1.0.6" 628 | }, 629 | "engines": { 630 | "node": ">=0.6" 631 | }, 632 | "funding": { 633 | "url": "https://github.com/sponsors/ljharb" 634 | } 635 | }, 636 | "node_modules/range-parser": { 637 | "version": "1.2.1", 638 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 639 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 640 | "license": "MIT", 641 | "engines": { 642 | "node": ">= 0.6" 643 | } 644 | }, 645 | "node_modules/raw-body": { 646 | "version": "2.5.2", 647 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 648 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 649 | "license": "MIT", 650 | "dependencies": { 651 | "bytes": "3.1.2", 652 | "http-errors": "2.0.0", 653 | "iconv-lite": "0.4.24", 654 | "unpipe": "1.0.0" 655 | }, 656 | "engines": { 657 | "node": ">= 0.8" 658 | } 659 | }, 660 | "node_modules/safe-buffer": { 661 | "version": "5.2.1", 662 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 663 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 664 | "funding": [ 665 | { 666 | "type": "github", 667 | "url": "https://github.com/sponsors/feross" 668 | }, 669 | { 670 | "type": "patreon", 671 | "url": "https://www.patreon.com/feross" 672 | }, 673 | { 674 | "type": "consulting", 675 | "url": "https://feross.org/support" 676 | } 677 | ], 678 | "license": "MIT" 679 | }, 680 | "node_modules/safer-buffer": { 681 | "version": "2.1.2", 682 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 683 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 684 | "license": "MIT" 685 | }, 686 | "node_modules/send": { 687 | "version": "0.19.0", 688 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 689 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 690 | "license": "MIT", 691 | "dependencies": { 692 | "debug": "2.6.9", 693 | "depd": "2.0.0", 694 | "destroy": "1.2.0", 695 | "encodeurl": "~1.0.2", 696 | "escape-html": "~1.0.3", 697 | "etag": "~1.8.1", 698 | "fresh": "0.5.2", 699 | "http-errors": "2.0.0", 700 | "mime": "1.6.0", 701 | "ms": "2.1.3", 702 | "on-finished": "2.4.1", 703 | "range-parser": "~1.2.1", 704 | "statuses": "2.0.1" 705 | }, 706 | "engines": { 707 | "node": ">= 0.8.0" 708 | } 709 | }, 710 | "node_modules/send/node_modules/encodeurl": { 711 | "version": "1.0.2", 712 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 713 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 714 | "license": "MIT", 715 | "engines": { 716 | "node": ">= 0.8" 717 | } 718 | }, 719 | "node_modules/send/node_modules/ms": { 720 | "version": "2.1.3", 721 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 722 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 723 | "license": "MIT" 724 | }, 725 | "node_modules/serve-static": { 726 | "version": "1.16.2", 727 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 728 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 729 | "license": "MIT", 730 | "dependencies": { 731 | "encodeurl": "~2.0.0", 732 | "escape-html": "~1.0.3", 733 | "parseurl": "~1.3.3", 734 | "send": "0.19.0" 735 | }, 736 | "engines": { 737 | "node": ">= 0.8.0" 738 | } 739 | }, 740 | "node_modules/set-function-length": { 741 | "version": "1.2.2", 742 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 743 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 744 | "license": "MIT", 745 | "dependencies": { 746 | "define-data-property": "^1.1.4", 747 | "es-errors": "^1.3.0", 748 | "function-bind": "^1.1.2", 749 | "get-intrinsic": "^1.2.4", 750 | "gopd": "^1.0.1", 751 | "has-property-descriptors": "^1.0.2" 752 | }, 753 | "engines": { 754 | "node": ">= 0.4" 755 | } 756 | }, 757 | "node_modules/setprototypeof": { 758 | "version": "1.2.0", 759 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 760 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 761 | "license": "ISC" 762 | }, 763 | "node_modules/side-channel": { 764 | "version": "1.0.6", 765 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 766 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 767 | "license": "MIT", 768 | "dependencies": { 769 | "call-bind": "^1.0.7", 770 | "es-errors": "^1.3.0", 771 | "get-intrinsic": "^1.2.4", 772 | "object-inspect": "^1.13.1" 773 | }, 774 | "engines": { 775 | "node": ">= 0.4" 776 | }, 777 | "funding": { 778 | "url": "https://github.com/sponsors/ljharb" 779 | } 780 | }, 781 | "node_modules/statuses": { 782 | "version": "2.0.1", 783 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 784 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 785 | "license": "MIT", 786 | "engines": { 787 | "node": ">= 0.8" 788 | } 789 | }, 790 | "node_modules/tdigest": { 791 | "version": "0.1.2", 792 | "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", 793 | "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", 794 | "license": "MIT", 795 | "dependencies": { 796 | "bintrees": "1.0.2" 797 | } 798 | }, 799 | "node_modules/toidentifier": { 800 | "version": "1.0.1", 801 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 802 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 803 | "license": "MIT", 804 | "engines": { 805 | "node": ">=0.6" 806 | } 807 | }, 808 | "node_modules/type-is": { 809 | "version": "1.6.18", 810 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 811 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 812 | "license": "MIT", 813 | "dependencies": { 814 | "media-typer": "0.3.0", 815 | "mime-types": "~2.1.24" 816 | }, 817 | "engines": { 818 | "node": ">= 0.6" 819 | } 820 | }, 821 | "node_modules/unpipe": { 822 | "version": "1.0.0", 823 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 824 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 825 | "license": "MIT", 826 | "engines": { 827 | "node": ">= 0.8" 828 | } 829 | }, 830 | "node_modules/utils-merge": { 831 | "version": "1.0.1", 832 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 833 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 834 | "license": "MIT", 835 | "engines": { 836 | "node": ">= 0.4.0" 837 | } 838 | }, 839 | "node_modules/vary": { 840 | "version": "1.1.2", 841 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 842 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 843 | "license": "MIT", 844 | "engines": { 845 | "node": ">= 0.8" 846 | } 847 | } 848 | } 849 | } 850 | -------------------------------------------------------------------------------- /grafana/cfg/grafana/dashboards/statisfactory.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "builtIn": 1, 6 | "datasource": { 7 | "type": "grafana", 8 | "uid": "-- Grafana --" 9 | }, 10 | "enable": true, 11 | "hide": true, 12 | "iconColor": "rgba(0, 211, 255, 1)", 13 | "name": "Annotations & Alerts", 14 | "type": "dashboard" 15 | } 16 | ] 17 | }, 18 | "editable": true, 19 | "fiscalYearStartMonth": 0, 20 | "graphTooltip": 0, 21 | "id": 1, 22 | "links": [], 23 | "panels": [ 24 | { 25 | "datasource": { 26 | "default": true, 27 | "type": "prometheus", 28 | "uid": "adyhxpuakmrcwf" 29 | }, 30 | "fieldConfig": { 31 | "defaults": { 32 | "color": { 33 | "mode": "palette-classic" 34 | }, 35 | "custom": { 36 | "axisBorderShow": false, 37 | "axisCenteredZero": false, 38 | "axisColorMode": "text", 39 | "axisLabel": "", 40 | "axisPlacement": "auto", 41 | "barAlignment": 0, 42 | "barWidthFactor": 0.6, 43 | "drawStyle": "line", 44 | "fillOpacity": 0, 45 | "gradientMode": "none", 46 | "hideFrom": { 47 | "legend": false, 48 | "tooltip": false, 49 | "viz": false 50 | }, 51 | "insertNulls": false, 52 | "lineInterpolation": "linear", 53 | "lineWidth": 1, 54 | "pointSize": 5, 55 | "scaleDistribution": { 56 | "type": "linear" 57 | }, 58 | "showPoints": "auto", 59 | "spanNulls": false, 60 | "stacking": { 61 | "group": "A", 62 | "mode": "none" 63 | }, 64 | "thresholdsStyle": { 65 | "mode": "off" 66 | } 67 | }, 68 | "mappings": [], 69 | "thresholds": { 70 | "mode": "absolute", 71 | "steps": [ 72 | { 73 | "color": "green", 74 | "value": null 75 | }, 76 | { 77 | "color": "red", 78 | "value": 80 79 | } 80 | ] 81 | } 82 | }, 83 | "overrides": [] 84 | }, 85 | "gridPos": { 86 | "h": 13, 87 | "w": 10, 88 | "x": 0, 89 | "y": 0 90 | }, 91 | "id": 3, 92 | "options": { 93 | "legend": { 94 | "calcs": [], 95 | "displayMode": "list", 96 | "placement": "bottom", 97 | "showLegend": true 98 | }, 99 | "tooltip": { 100 | "mode": "single", 101 | "sort": "none" 102 | } 103 | }, 104 | "pluginVersion": "11.2.0", 105 | "targets": [ 106 | { 107 | "datasource": { 108 | "type": "prometheus", 109 | "uid": "adyhxpuakmrcwf" 110 | }, 111 | "disableTextWrap": false, 112 | "editorMode": "builder", 113 | "expr": "depot", 114 | "fullMetaSearch": false, 115 | "includeNullMetadata": true, 116 | "instant": false, 117 | "legendFormat": "{{item}}", 118 | "range": true, 119 | "refId": "A", 120 | "useBackend": false 121 | } 122 | ], 123 | "title": "Depots Over Time", 124 | "type": "timeseries" 125 | }, 126 | { 127 | "datasource": { 128 | "default": true, 129 | "type": "prometheus", 130 | "uid": "adyhxpuakmrcwf" 131 | }, 132 | "fieldConfig": { 133 | "defaults": { 134 | "color": { 135 | "mode": "continuous-RdYlGr" 136 | }, 137 | "mappings": [], 138 | "thresholds": { 139 | "mode": "percentage", 140 | "steps": [ 141 | { 142 | "color": "red", 143 | "value": null 144 | } 145 | ] 146 | }, 147 | "overrides": [ 148 | { 149 | "matcher": { 150 | "id": "byName", 151 | "options": "Uranium Waste" 152 | }, 153 | "properties": [ 154 | { 155 | "id": "max", 156 | "value": 2500 157 | } 158 | ] 159 | }, 160 | { 161 | "matcher": { 162 | "id": "byName", 163 | "options": "Plutonium Waste" 164 | }, 165 | "properties": [ 166 | { 167 | "id": "max", 168 | "value": 2500 169 | } 170 | ] 171 | }, 172 | { 173 | "matcher": { 174 | "id": "byName", 175 | "options": "Steel Beam" 176 | }, 177 | "properties": [ 178 | { 179 | "id": "max", 180 | "value": 1000 181 | } 182 | ] 183 | }, 184 | { 185 | "matcher": { 186 | "id": "byName", 187 | "options": "Iron Plate" 188 | }, 189 | "properties": [ 190 | { 191 | "id": "max", 192 | "value": 1000 193 | } 194 | ] 195 | }, 196 | { 197 | "matcher": { 198 | "id": "byName", 199 | "options": "Concrete" 200 | }, 201 | "properties": [ 202 | { 203 | "id": "max", 204 | "value": 2500 205 | } 206 | ] 207 | }, 208 | { 209 | "matcher": { 210 | "id": "byName", 211 | "options": "Silica" 212 | }, 213 | "properties": [ 214 | { 215 | "id": "max", 216 | "value": 1000 217 | } 218 | ] 219 | }, 220 | { 221 | "matcher": { 222 | "id": "byName", 223 | "options": "Limestone" 224 | }, 225 | "properties": [ 226 | { 227 | "id": "max", 228 | "value": 500 229 | } 230 | ] 231 | }, 232 | { 233 | "matcher": { 234 | "id": "byName", 235 | "options": "Raw Quartz" 236 | }, 237 | "properties": [ 238 | { 239 | "id": "max", 240 | "value": 500 241 | } 242 | ] 243 | }, 244 | { 245 | "matcher": { 246 | "id": "byName", 247 | "options": "Rotor" 248 | }, 249 | "properties": [ 250 | { 251 | "id": "max", 252 | "value": 500 253 | } 254 | ] 255 | }, 256 | { 257 | "matcher": { 258 | "id": "byName", 259 | "options": "Modular Frame" 260 | }, 261 | "properties": [ 262 | { 263 | "id": "max", 264 | "value": 250 265 | } 266 | ] 267 | }, 268 | { 269 | "matcher": { 270 | "id": "byName", 271 | "options": "Iron Rod" 272 | }, 273 | "properties": [ 274 | { 275 | "id": "max", 276 | "value": 1000 277 | } 278 | ] 279 | }, 280 | { 281 | "matcher": { 282 | "id": "byName", 283 | "options": "Screw" 284 | }, 285 | "properties": [ 286 | { 287 | "id": "max", 288 | "value": 2500 289 | } 290 | ] 291 | }, 292 | { 293 | "matcher": { 294 | "id": "byName", 295 | "options": "Wire" 296 | }, 297 | "properties": [ 298 | { 299 | "id": "max", 300 | "value": 2500 301 | } 302 | ] 303 | }, 304 | { 305 | "matcher": { 306 | "id": "byName", 307 | "options": "Turbo Motor" 308 | }, 309 | "properties": [ 310 | { 311 | "id": "max", 312 | "value": 250 313 | } 314 | ] 315 | }, 316 | { 317 | "matcher": { 318 | "id": "byName", 319 | "options": "Somersloop" 320 | }, 321 | "properties": [ 322 | { 323 | "id": "max", 324 | "value": 250 325 | } 326 | ] 327 | }, 328 | { 329 | "matcher": { 330 | "id": "byName", 331 | "options": "Mercer Sphere" 332 | }, 333 | "properties": [ 334 | { 335 | "id": "max", 336 | "value": 250 337 | } 338 | ] 339 | }, 340 | { 341 | "matcher": { 342 | "id": "byName", 343 | "options": "Supercomputer" 344 | }, 345 | "properties": [ 346 | { 347 | "id": "max", 348 | "value": 250 349 | } 350 | ] 351 | }, 352 | { 353 | "matcher": { 354 | "id": "byName", 355 | "options": "Computer" 356 | }, 357 | "properties": [ 358 | { 359 | "id": "max", 360 | "value": 250 361 | } 362 | ] 363 | }, 364 | { 365 | "matcher": { 366 | "id": "byName", 367 | "options": "Crystal Oscillator" 368 | }, 369 | "properties": [ 370 | { 371 | "id": "max", 372 | "value": 500 373 | } 374 | ] 375 | }, 376 | { 377 | "matcher": { 378 | "id": "byName", 379 | "options": "Motor" 380 | }, 381 | "properties": [ 382 | { 383 | "id": "max", 384 | "value": 250 385 | } 386 | ] 387 | }, 388 | { 389 | "matcher": { 390 | "id": "byName", 391 | "options": "Beryl Nut" 392 | }, 393 | "properties": [ 394 | { 395 | "id": "max", 396 | "value": 500 397 | } 398 | ] 399 | }, 400 | { 401 | "matcher": { 402 | "id": "byName", 403 | "options": "Paleberry" 404 | }, 405 | "properties": [ 406 | { 407 | "id": "max", 408 | "value": 250 409 | } 410 | ] 411 | }, 412 | { 413 | "matcher": { 414 | "id": "byName", 415 | "options": "Bacon Agaric" 416 | }, 417 | "properties": [ 418 | { 419 | "id": "max", 420 | "value": 250 421 | } 422 | ] 423 | }, 424 | { 425 | "matcher": { 426 | "id": "byName", 427 | "options": "Water" 428 | }, 429 | "properties": [ 430 | { 431 | "id": "max", 432 | "value": 250000 433 | } 434 | ] 435 | }, 436 | { 437 | "matcher": { 438 | "id": "byName", 439 | "options": "Object Scanner" 440 | }, 441 | "properties": [ 442 | { 443 | "id": "max", 444 | "value": 5 445 | } 446 | ] 447 | }, 448 | { 449 | "matcher": { 450 | "id": "byName", 451 | "options": "Crude Oil" 452 | }, 453 | "properties": [ 454 | { 455 | "id": "max", 456 | "value": 250000 457 | } 458 | ] 459 | }, 460 | { 461 | "matcher": { 462 | "id": "byName", 463 | "options": "Purple Power Slug" 464 | }, 465 | "properties": [ 466 | { 467 | "id": "max", 468 | "value": 250 469 | } 470 | ] 471 | }, 472 | { 473 | "matcher": { 474 | "id": "byName", 475 | "options": "Yellow Power Slug" 476 | }, 477 | "properties": [ 478 | { 479 | "id": "max", 480 | "value": 250 481 | } 482 | ] 483 | }, 484 | { 485 | "matcher": { 486 | "id": "byName", 487 | "options": "Blue Power Slug" 488 | }, 489 | "properties": [ 490 | { 491 | "id": "max", 492 | "value": 250 493 | } 494 | ] 495 | }, 496 | { 497 | "matcher": { 498 | "id": "byName", 499 | "options": "Nitrogen Gas" 500 | }, 501 | "properties": [ 502 | { 503 | "id": "max", 504 | "value": 250000 505 | } 506 | ] 507 | }, 508 | { 509 | "matcher": { 510 | "id": "byName", 511 | "options": "SAM" 512 | }, 513 | "properties": [ 514 | { 515 | "id": "max", 516 | "value": 500 517 | } 518 | ] 519 | }, 520 | { 521 | "matcher": { 522 | "id": "byName", 523 | "options": "Encased Industrial Beam" 524 | }, 525 | "properties": [ 526 | { 527 | "id": "max", 528 | "value": 500 529 | } 530 | ] 531 | }, 532 | { 533 | "matcher": { 534 | "id": "byName", 535 | "options": "Rubber" 536 | }, 537 | "properties": [ 538 | { 539 | "id": "max", 540 | "value": 1000 541 | } 542 | ] 543 | }, 544 | { 545 | "matcher": { 546 | "id": "byName", 547 | "options": "Copper Ore" 548 | }, 549 | "properties": [ 550 | { 551 | "id": "max", 552 | "value": 500 553 | } 554 | ] 555 | }, 556 | { 557 | "matcher": { 558 | "id": "byName", 559 | "options": "Iron Ore" 560 | }, 561 | "properties": [ 562 | { 563 | "id": "max", 564 | "value": 500 565 | } 566 | ] 567 | }, 568 | { 569 | "matcher": { 570 | "id": "byName", 571 | "options": "Caterium Ore" 572 | }, 573 | "properties": [ 574 | { 575 | "id": "max", 576 | "value": 500 577 | } 578 | ] 579 | }, 580 | { 581 | "matcher": { 582 | "id": "byName", 583 | "options": "Bauxite" 584 | }, 585 | "properties": [ 586 | { 587 | "id": "max", 588 | "value": 500 589 | } 590 | ] 591 | }, 592 | { 593 | "matcher": { 594 | "id": "byName", 595 | "options": "Sulfur" 596 | }, 597 | "properties": [ 598 | { 599 | "id": "max", 600 | "value": 500 601 | } 602 | ] 603 | }, 604 | { 605 | "matcher": { 606 | "id": "byName", 607 | "options": "Uranium" 608 | }, 609 | "properties": [ 610 | { 611 | "id": "max", 612 | "value": 500 613 | } 614 | ] 615 | }, 616 | { 617 | "matcher": { 618 | "id": "byName", 619 | "options": "Coal" 620 | }, 621 | "properties": [ 622 | { 623 | "id": "max", 624 | "value": 500 625 | } 626 | ] 627 | }, 628 | { 629 | "matcher": { 630 | "id": "byName", 631 | "options": "Iodine-Infused Filter" 632 | }, 633 | "properties": [ 634 | { 635 | "id": "max", 636 | "value": 250 637 | } 638 | ] 639 | }, 640 | { 641 | "matcher": { 642 | "id": "byName", 643 | "options": "Portable Miner" 644 | }, 645 | "properties": [ 646 | { 647 | "id": "max", 648 | "value": 250 649 | } 650 | ] 651 | }, 652 | { 653 | "matcher": { 654 | "id": "byName", 655 | "options": "Hazmat Suit" 656 | }, 657 | "properties": [ 658 | { 659 | "id": "max", 660 | "value": 5 661 | } 662 | ] 663 | }, 664 | { 665 | "matcher": { 666 | "id": "byName", 667 | "options": "Factory Cart™" 668 | }, 669 | "properties": [ 670 | { 671 | "id": "max", 672 | "value": 5 673 | } 674 | ] 675 | }, 676 | { 677 | "matcher": { 678 | "id": "byName", 679 | "options": "Golden Factory Cart™" 680 | }, 681 | "properties": [ 682 | { 683 | "id": "max", 684 | "value": 5 685 | } 686 | ] 687 | }, 688 | { 689 | "matcher": { 690 | "id": "byName", 691 | "options": "Iron Rebar" 692 | }, 693 | "properties": [ 694 | { 695 | "id": "max", 696 | "value": 500 697 | } 698 | ] 699 | }, 700 | { 701 | "matcher": { 702 | "id": "byName", 703 | "options": "Rebar Gun" 704 | }, 705 | "properties": [ 706 | { 707 | "id": "max", 708 | "value": 5 709 | } 710 | ] 711 | }, 712 | { 713 | "matcher": { 714 | "id": "byName", 715 | "options": "Stun Rebar" 716 | }, 717 | "properties": [ 718 | { 719 | "id": "max", 720 | "value": 500 721 | } 722 | ] 723 | }, 724 | { 725 | "matcher": { 726 | "id": "byName", 727 | "options": "Explosive Rebar" 728 | }, 729 | "properties": [ 730 | { 731 | "id": "max", 732 | "value": 500 733 | } 734 | ] 735 | }, 736 | { 737 | "matcher": { 738 | "id": "byName", 739 | "options": "Shatter Rebar" 740 | }, 741 | "properties": [ 742 | { 743 | "id": "max", 744 | "value": 500 745 | } 746 | ] 747 | }, 748 | { 749 | "matcher": { 750 | "id": "byName", 751 | "options": "Homing Rifle Ammo" 752 | }, 753 | "properties": [ 754 | { 755 | "id": "max", 756 | "value": 2500 757 | } 758 | ] 759 | }, 760 | { 761 | "matcher": { 762 | "id": "byName", 763 | "options": "Rifle" 764 | }, 765 | "properties": [ 766 | { 767 | "id": "max", 768 | "value": 5 769 | } 770 | ] 771 | }, 772 | { 773 | "matcher": { 774 | "id": "byName", 775 | "options": "Rifle Ammo" 776 | }, 777 | "properties": [ 778 | { 779 | "id": "max", 780 | "value": 2500 781 | } 782 | ] 783 | }, 784 | { 785 | "matcher": { 786 | "id": "byName", 787 | "options": "Turbo Rifle Ammo" 788 | }, 789 | "properties": [ 790 | { 791 | "id": "max", 792 | "value": 2500 793 | } 794 | ] 795 | }, 796 | { 797 | "matcher": { 798 | "id": "byName", 799 | "options": "Cable" 800 | }, 801 | "properties": [ 802 | { 803 | "id": "max", 804 | "value": 1000 805 | } 806 | ] 807 | }, 808 | { 809 | "matcher": { 810 | "id": "byName", 811 | "options": "Power Shard" 812 | }, 813 | "properties": [ 814 | { 815 | "id": "max", 816 | "value": 500 817 | } 818 | ] 819 | }, 820 | { 821 | "matcher": { 822 | "id": "byName", 823 | "options": "Medicinal Inhaler" 824 | }, 825 | "properties": [ 826 | { 827 | "id": "max", 828 | "value": 250 829 | } 830 | ] 831 | }, 832 | { 833 | "matcher": { 834 | "id": "byName", 835 | "options": "Reinforced Iron Plate" 836 | }, 837 | "properties": [ 838 | { 839 | "id": "max", 840 | "value": 500 841 | } 842 | ] 843 | }, 844 | { 845 | "matcher": { 846 | "id": "byName", 847 | "options": "Fused Modular Frame" 848 | }, 849 | "properties": [ 850 | { 851 | "id": "max", 852 | "value": 250 853 | } 854 | ] 855 | }, 856 | { 857 | "matcher": { 858 | "id": "byName", 859 | "options": "Superposition Oscillator" 860 | }, 861 | "properties": [ 862 | { 863 | "id": "max", 864 | "value": 500 865 | } 866 | ] 867 | }, 868 | { 869 | "matcher": { 870 | "id": "byName", 871 | "options": "Wood" 872 | }, 873 | "properties": [ 874 | { 875 | "id": "max", 876 | "value": 1000 877 | } 878 | ] 879 | }, 880 | { 881 | "matcher": { 882 | "id": "byName", 883 | "options": "Leaves" 884 | }, 885 | "properties": [ 886 | { 887 | "id": "max", 888 | "value": 2500 889 | } 890 | ] 891 | }, 892 | { 893 | "matcher": { 894 | "id": "byName", 895 | "options": "Xeno-Zapper" 896 | }, 897 | "properties": [ 898 | { 899 | "id": "max", 900 | "value": 5 901 | } 902 | ] 903 | }, 904 | { 905 | "matcher": { 906 | "id": "byName", 907 | "options": "Iron Ingot" 908 | }, 909 | "properties": [ 910 | { 911 | "id": "max", 912 | "value": 500 913 | } 914 | ] 915 | }, 916 | { 917 | "matcher": { 918 | "id": "byName", 919 | "options": "Copper Sheet" 920 | }, 921 | "properties": [ 922 | { 923 | "id": "max", 924 | "value": 1000 925 | } 926 | ] 927 | }, 928 | { 929 | "matcher": { 930 | "id": "byName", 931 | "options": "Alclad Aluminum Sheet" 932 | }, 933 | "properties": [ 934 | { 935 | "id": "max", 936 | "value": 1000 937 | } 938 | ] 939 | }, 940 | { 941 | "matcher": { 942 | "id": "byName", 943 | "options": "Time Crystal" 944 | }, 945 | "properties": [ 946 | { 947 | "id": "max", 948 | "value": 1000 949 | } 950 | ] 951 | }, 952 | { 953 | "matcher": { 954 | "id": "byName", 955 | "options": "Excited Photonic Matter" 956 | }, 957 | "properties": [ 958 | { 959 | "id": "max", 960 | "value": 250000 961 | } 962 | ] 963 | }, 964 | { 965 | "matcher": { 966 | "id": "byName", 967 | "options": "Ficsite Trigon" 968 | }, 969 | "properties": [ 970 | { 971 | "id": "max", 972 | "value": 1000 973 | } 974 | ] 975 | }, 976 | { 977 | "matcher": { 978 | "id": "byName", 979 | "options": "Dark Matter Residue" 980 | }, 981 | "properties": [ 982 | { 983 | "id": "max", 984 | "value": 250000 985 | } 986 | ] 987 | }, 988 | { 989 | "matcher": { 990 | "id": "byName", 991 | "options": "Cooling System" 992 | }, 993 | "properties": [ 994 | { 995 | "id": "max", 996 | "value": 500 997 | } 998 | ] 999 | }, 1000 | { 1001 | "matcher": { 1002 | "id": "byName", 1003 | "options": "Diamonds" 1004 | }, 1005 | "properties": [ 1006 | { 1007 | "id": "max", 1008 | "value": 1000 1009 | } 1010 | ] 1011 | }, 1012 | { 1013 | "matcher": { 1014 | "id": "byName", 1015 | "options": "Reanimated SAM" 1016 | }, 1017 | "properties": [ 1018 | { 1019 | "id": "max", 1020 | "value": 500 1021 | } 1022 | ] 1023 | }, 1024 | { 1025 | "matcher": { 1026 | "id": "byName", 1027 | "options": "Neural-Quantum Processor" 1028 | }, 1029 | "properties": [ 1030 | { 1031 | "id": "max", 1032 | "value": 500 1033 | } 1034 | ] 1035 | }, 1036 | { 1037 | "matcher": { 1038 | "id": "byName", 1039 | "options": "Dark Matter Crystal" 1040 | }, 1041 | "properties": [ 1042 | { 1043 | "id": "max", 1044 | "value": 1000 1045 | } 1046 | ] 1047 | }, 1048 | { 1049 | "matcher": { 1050 | "id": "byName", 1051 | "options": "Magnetic Field Generator" 1052 | }, 1053 | "properties": [ 1054 | { 1055 | "id": "max", 1056 | "value": 250 1057 | } 1058 | ] 1059 | }, 1060 | { 1061 | "matcher": { 1062 | "id": "byName", 1063 | "options": "AI Expansion Server" 1064 | }, 1065 | "properties": [ 1066 | { 1067 | "id": "max", 1068 | "value": 250 1069 | } 1070 | ] 1071 | }, 1072 | { 1073 | "matcher": { 1074 | "id": "byName", 1075 | "options": "Ficsite Ingot" 1076 | }, 1077 | "properties": [ 1078 | { 1079 | "id": "max", 1080 | "value": 500 1081 | } 1082 | ] 1083 | }, 1084 | { 1085 | "matcher": { 1086 | "id": "byName", 1087 | "options": "Steel Pipe" 1088 | }, 1089 | "properties": [ 1090 | { 1091 | "id": "max", 1092 | "value": 1000 1093 | } 1094 | ] 1095 | }, 1096 | { 1097 | "matcher": { 1098 | "id": "byName", 1099 | "options": "Assembly Director System" 1100 | }, 1101 | "properties": [ 1102 | { 1103 | "id": "max", 1104 | "value": 250 1105 | } 1106 | ] 1107 | }, 1108 | { 1109 | "matcher": { 1110 | "id": "byName", 1111 | "options": "Radio Control Unit" 1112 | }, 1113 | "properties": [ 1114 | { 1115 | "id": "max", 1116 | "value": 250 1117 | } 1118 | ] 1119 | }, 1120 | { 1121 | "matcher": { 1122 | "id": "byName", 1123 | "options": "Aluminum Ingot" 1124 | }, 1125 | "properties": [ 1126 | { 1127 | "id": "max", 1128 | "value": 500 1129 | } 1130 | ] 1131 | }, 1132 | { 1133 | "matcher": { 1134 | "id": "byName", 1135 | "options": "Biochemical Sculptor" 1136 | }, 1137 | "properties": [ 1138 | { 1139 | "id": "max", 1140 | "value": 250 1141 | } 1142 | ] 1143 | }, 1144 | { 1145 | "matcher": { 1146 | "id": "byName", 1147 | "options": "SAM Fluctuator" 1148 | }, 1149 | "properties": [ 1150 | { 1151 | "id": "max", 1152 | "value": 500 1153 | } 1154 | ] 1155 | }, 1156 | { 1157 | "matcher": { 1158 | "id": "byName", 1159 | "options": "Caterium Ingot" 1160 | }, 1161 | "properties": [ 1162 | { 1163 | "id": "max", 1164 | "value": 500 1165 | } 1166 | ] 1167 | }, 1168 | { 1169 | "matcher": { 1170 | "id": "byName", 1171 | "options": "Petroleum Coke" 1172 | }, 1173 | "properties": [ 1174 | { 1175 | "id": "max", 1176 | "value": 1000 1177 | } 1178 | ] 1179 | }, 1180 | { 1181 | "matcher": { 1182 | "id": "byName", 1183 | "options": "Quartz Crystal" 1184 | }, 1185 | "properties": [ 1186 | { 1187 | "id": "max", 1188 | "value": 1000 1189 | } 1190 | ] 1191 | }, 1192 | { 1193 | "matcher": { 1194 | "id": "byName", 1195 | "options": "Fuel" 1196 | }, 1197 | "properties": [ 1198 | { 1199 | "id": "max", 1200 | "value": 250000 1201 | } 1202 | ] 1203 | }, 1204 | { 1205 | "matcher": { 1206 | "id": "byName", 1207 | "options": "Turbofuel" 1208 | }, 1209 | "properties": [ 1210 | { 1211 | "id": "max", 1212 | "value": 250000 1213 | } 1214 | ] 1215 | }, 1216 | { 1217 | "matcher": { 1218 | "id": "byName", 1219 | "options": "Packaged Turbofuel" 1220 | }, 1221 | "properties": [ 1222 | { 1223 | "id": "max", 1224 | "value": 500 1225 | } 1226 | ] 1227 | }, 1228 | { 1229 | "matcher": { 1230 | "id": "byName", 1231 | "options": "Packaged Fuel" 1232 | }, 1233 | "properties": [ 1234 | { 1235 | "id": "max", 1236 | "value": 500 1237 | } 1238 | ] 1239 | }, 1240 | { 1241 | "matcher": { 1242 | "id": "byName", 1243 | "options": "Heavy Oil Residue" 1244 | }, 1245 | "properties": [ 1246 | { 1247 | "id": "max", 1248 | "value": 250000 1249 | } 1250 | ] 1251 | }, 1252 | { 1253 | "matcher": { 1254 | "id": "byName", 1255 | "options": "Empty Canister" 1256 | }, 1257 | "properties": [ 1258 | { 1259 | "id": "max", 1260 | "value": 500 1261 | } 1262 | ] 1263 | }, 1264 | { 1265 | "matcher": { 1266 | "id": "byName", 1267 | "options": "Compacted Coal" 1268 | }, 1269 | "properties": [ 1270 | { 1271 | "id": "max", 1272 | "value": 500 1273 | } 1274 | ] 1275 | }, 1276 | { 1277 | "matcher": { 1278 | "id": "byName", 1279 | "options": "Plastic" 1280 | }, 1281 | "properties": [ 1282 | { 1283 | "id": "max", 1284 | "value": 1000 1285 | } 1286 | ] 1287 | }, 1288 | { 1289 | "matcher": { 1290 | "id": "byName", 1291 | "options": "Biomass" 1292 | }, 1293 | "properties": [ 1294 | { 1295 | "id": "max", 1296 | "value": 1000 1297 | } 1298 | ] 1299 | }, 1300 | { 1301 | "matcher": { 1302 | "id": "byName", 1303 | "options": "Circuit Board" 1304 | }, 1305 | "properties": [ 1306 | { 1307 | "id": "max", 1308 | "value": 1000 1309 | } 1310 | ] 1311 | }, 1312 | { 1313 | "matcher": { 1314 | "id": "byName", 1315 | "options": "Polymer Resin" 1316 | }, 1317 | "properties": [ 1318 | { 1319 | "id": "max", 1320 | "value": 1000 1321 | } 1322 | ] 1323 | }, 1324 | { 1325 | "matcher": { 1326 | "id": "byName", 1327 | "options": "Empty Fluid Tank" 1328 | }, 1329 | "properties": [ 1330 | { 1331 | "id": "max", 1332 | "value": 500 1333 | } 1334 | ] 1335 | }, 1336 | { 1337 | "matcher": { 1338 | "id": "byName", 1339 | "options": "Packaged Ionized Fuel" 1340 | }, 1341 | "properties": [ 1342 | { 1343 | "id": "max", 1344 | "value": 500 1345 | } 1346 | ] 1347 | }, 1348 | { 1349 | "matcher": { 1350 | "id": "byName", 1351 | "options": "Ionized Fuel" 1352 | }, 1353 | "properties": [ 1354 | { 1355 | "id": "max", 1356 | "value": 250000 1357 | } 1358 | ] 1359 | }, 1360 | { 1361 | "matcher": { 1362 | "id": "byName", 1363 | "options": "Rocket Fuel" 1364 | }, 1365 | "properties": [ 1366 | { 1367 | "id": "max", 1368 | "value": 250000 1369 | } 1370 | ] 1371 | }, 1372 | { 1373 | "matcher": { 1374 | "id": "byName", 1375 | "options": "Packaged Rocket Fuel" 1376 | }, 1377 | "properties": [ 1378 | { 1379 | "id": "max", 1380 | "value": 500 1381 | } 1382 | ] 1383 | }, 1384 | { 1385 | "matcher": { 1386 | "id": "byName", 1387 | "options": "Nitric Acid" 1388 | }, 1389 | "properties": [ 1390 | { 1391 | "id": "max", 1392 | "value": 250000 1393 | } 1394 | ] 1395 | }, 1396 | { 1397 | "matcher": { 1398 | "id": "byName", 1399 | "options": "Smart Plating" 1400 | }, 1401 | "properties": [ 1402 | { 1403 | "id": "max", 1404 | "value": 250 1405 | } 1406 | ] 1407 | }, 1408 | { 1409 | "matcher": { 1410 | "id": "byName", 1411 | "options": "Copper Ingot" 1412 | }, 1413 | "properties": [ 1414 | { 1415 | "id": "max", 1416 | "value": 500 1417 | } 1418 | ] 1419 | }, 1420 | { 1421 | "matcher": { 1422 | "id": "byName", 1423 | "options": "Packaged Heavy Oil Residue" 1424 | }, 1425 | "properties": [ 1426 | { 1427 | "id": "max", 1428 | "value": 500 1429 | } 1430 | ] 1431 | }, 1432 | { 1433 | "matcher": { 1434 | "id": "byName", 1435 | "options": "Packaged Water" 1436 | }, 1437 | "properties": [ 1438 | { 1439 | "id": "max", 1440 | "value": 500 1441 | } 1442 | ] 1443 | }, 1444 | { 1445 | "matcher": { 1446 | "id": "byName", 1447 | "options": "Liquid Biofuel" 1448 | }, 1449 | "properties": [ 1450 | { 1451 | "id": "max", 1452 | "value": 250000 1453 | } 1454 | ] 1455 | }, 1456 | { 1457 | "matcher": { 1458 | "id": "byName", 1459 | "options": "Packaged Liquid Biofuel" 1460 | }, 1461 | "properties": [ 1462 | { 1463 | "id": "max", 1464 | "value": 500 1465 | } 1466 | ] 1467 | }, 1468 | { 1469 | "matcher": { 1470 | "id": "byName", 1471 | "options": "Solid Biofuel" 1472 | }, 1473 | "properties": [ 1474 | { 1475 | "id": "max", 1476 | "value": 1000 1477 | } 1478 | ] 1479 | }, 1480 | { 1481 | "matcher": { 1482 | "id": "byName", 1483 | "options": "Packaged Oil" 1484 | }, 1485 | "properties": [ 1486 | { 1487 | "id": "max", 1488 | "value": 500 1489 | } 1490 | ] 1491 | }, 1492 | { 1493 | "matcher": { 1494 | "id": "byName", 1495 | "options": "Steel Ingot" 1496 | }, 1497 | "properties": [ 1498 | { 1499 | "id": "max", 1500 | "value": 500 1501 | } 1502 | ] 1503 | }, 1504 | { 1505 | "matcher": { 1506 | "id": "byName", 1507 | "options": "Versatile Framework" 1508 | }, 1509 | "properties": [ 1510 | { 1511 | "id": "max", 1512 | "value": 250 1513 | } 1514 | ] 1515 | }, 1516 | { 1517 | "matcher": { 1518 | "id": "byName", 1519 | "options": "Alumina Solution" 1520 | }, 1521 | "properties": [ 1522 | { 1523 | "id": "max", 1524 | "value": 250000 1525 | } 1526 | ] 1527 | }, 1528 | { 1529 | "matcher": { 1530 | "id": "byName", 1531 | "options": "Heavy Modular Frame" 1532 | }, 1533 | "properties": [ 1534 | { 1535 | "id": "max", 1536 | "value": 250 1537 | } 1538 | ] 1539 | }, 1540 | { 1541 | "matcher": { 1542 | "id": "byName", 1543 | "options": "Aluminum Scrap" 1544 | }, 1545 | "properties": [ 1546 | { 1547 | "id": "max", 1548 | "value": 2500 1549 | } 1550 | ] 1551 | }, 1552 | { 1553 | "matcher": { 1554 | "id": "byName", 1555 | "options": "Aluminum Casing" 1556 | }, 1557 | "properties": [ 1558 | { 1559 | "id": "max", 1560 | "value": 1000 1561 | } 1562 | ] 1563 | }, 1564 | { 1565 | "matcher": { 1566 | "id": "byName", 1567 | "options": "Packaged Alumina Solution" 1568 | }, 1569 | "properties": [ 1570 | { 1571 | "id": "max", 1572 | "value": 500 1573 | } 1574 | ] 1575 | }, 1576 | { 1577 | "matcher": { 1578 | "id": "byName", 1579 | "options": "Modular Engine" 1580 | }, 1581 | "properties": [ 1582 | { 1583 | "id": "max", 1584 | "value": 250 1585 | } 1586 | ] 1587 | }, 1588 | { 1589 | "matcher": { 1590 | "id": "byName", 1591 | "options": "Automated Wiring" 1592 | }, 1593 | "properties": [ 1594 | { 1595 | "id": "max", 1596 | "value": 250 1597 | } 1598 | ] 1599 | }, 1600 | { 1601 | "matcher": { 1602 | "id": "byName", 1603 | "options": "Adaptive Control Unit" 1604 | }, 1605 | "properties": [ 1606 | { 1607 | "id": "max", 1608 | "value": 250 1609 | } 1610 | ] 1611 | }, 1612 | { 1613 | "matcher": { 1614 | "id": "byName", 1615 | "options": "High-Speed Connector" 1616 | }, 1617 | "properties": [ 1618 | { 1619 | "id": "max", 1620 | "value": 500 1621 | } 1622 | ] 1623 | }, 1624 | { 1625 | "matcher": { 1626 | "id": "byName", 1627 | "options": "Stator" 1628 | }, 1629 | "properties": [ 1630 | { 1631 | "id": "max", 1632 | "value": 500 1633 | } 1634 | ] 1635 | }, 1636 | { 1637 | "matcher": { 1638 | "id": "byName", 1639 | "options": "AI Limiter" 1640 | }, 1641 | "properties": [ 1642 | { 1643 | "id": "max", 1644 | "value": 500 1645 | } 1646 | ] 1647 | }, 1648 | { 1649 | "matcher": { 1650 | "id": "byName", 1651 | "options": "Quickwire" 1652 | }, 1653 | "properties": [ 1654 | { 1655 | "id": "max", 1656 | "value": 2500 1657 | } 1658 | ] 1659 | }, 1660 | { 1661 | "matcher": { 1662 | "id": "byName", 1663 | "options": "Heat Sink" 1664 | }, 1665 | "properties": [ 1666 | { 1667 | "id": "max", 1668 | "value": 500 1669 | } 1670 | ] 1671 | }, 1672 | { 1673 | "matcher": { 1674 | "id": "byName", 1675 | "options": "Battery" 1676 | }, 1677 | "properties": [ 1678 | { 1679 | "id": "max", 1680 | "value": 1000 1681 | } 1682 | ] 1683 | }, 1684 | { 1685 | "matcher": { 1686 | "id": "byName", 1687 | "options": "Packaged Sulfuric Acid" 1688 | }, 1689 | "properties": [ 1690 | { 1691 | "id": "max", 1692 | "value": 500 1693 | } 1694 | ] 1695 | }, 1696 | { 1697 | "matcher": { 1698 | "id": "byName", 1699 | "options": "Sulfuric Acid" 1700 | }, 1701 | "properties": [ 1702 | { 1703 | "id": "max", 1704 | "value": 250000 1705 | } 1706 | ] 1707 | }, 1708 | { 1709 | "matcher": { 1710 | "id": "byName", 1711 | "options": "Encased Uranium Cell" 1712 | }, 1713 | "properties": [ 1714 | { 1715 | "id": "max", 1716 | "value": 1000 1717 | } 1718 | ] 1719 | }, 1720 | { 1721 | "matcher": { 1722 | "id": "byName", 1723 | "options": "Non-Fissile Uranium" 1724 | }, 1725 | "properties": [ 1726 | { 1727 | "id": "max", 1728 | "value": 2500 1729 | } 1730 | ] 1731 | }, 1732 | { 1733 | "matcher": { 1734 | "id": "byName", 1735 | "options": "Packaged Nitrogen Gas" 1736 | }, 1737 | "properties": [ 1738 | { 1739 | "id": "max", 1740 | "value": 500 1741 | } 1742 | ] 1743 | }, 1744 | { 1745 | "matcher": { 1746 | "id": "byName", 1747 | "options": "Uranium Fuel Rod" 1748 | }, 1749 | "properties": [ 1750 | { 1751 | "id": "max", 1752 | "value": 250 1753 | } 1754 | ] 1755 | }, 1756 | { 1757 | "matcher": { 1758 | "id": "byName", 1759 | "options": "Electromagnetic Control Rod" 1760 | }, 1761 | "properties": [ 1762 | { 1763 | "id": "max", 1764 | "value": 500 1765 | } 1766 | ] 1767 | }, 1768 | { 1769 | "matcher": { 1770 | "id": "byName", 1771 | "options": "Pressure Conversion Cube" 1772 | }, 1773 | "properties": [ 1774 | { 1775 | "id": "max", 1776 | "value": 250 1777 | } 1778 | ] 1779 | }, 1780 | { 1781 | "matcher": { 1782 | "id": "byName", 1783 | "options": "Plutonium Pellet" 1784 | }, 1785 | "properties": [ 1786 | { 1787 | "id": "max", 1788 | "value": 500 1789 | } 1790 | ] 1791 | }, 1792 | { 1793 | "matcher": { 1794 | "id": "byName", 1795 | "options": "Packaged Nitric Acid" 1796 | }, 1797 | "properties": [ 1798 | { 1799 | "id": "max", 1800 | "value": 500 1801 | } 1802 | ] 1803 | }, 1804 | { 1805 | "matcher": { 1806 | "id": "byName", 1807 | "options": "Nuclear Pasta" 1808 | }, 1809 | "properties": [ 1810 | { 1811 | "id": "max", 1812 | "value": 250 1813 | } 1814 | ] 1815 | }, 1816 | { 1817 | "matcher": { 1818 | "id": "byName", 1819 | "options": "Plutonium Fuel Rod" 1820 | }, 1821 | "properties": [ 1822 | { 1823 | "id": "max", 1824 | "value": 250 1825 | } 1826 | ] 1827 | }, 1828 | { 1829 | "matcher": { 1830 | "id": "byName", 1831 | "options": "Encased Plutonium Cell" 1832 | }, 1833 | "properties": [ 1834 | { 1835 | "id": "max", 1836 | "value": 1000 1837 | } 1838 | ] 1839 | }, 1840 | { 1841 | "matcher": { 1842 | "id": "byName", 1843 | "options": "Copper Powder" 1844 | }, 1845 | "properties": [ 1846 | { 1847 | "id": "max", 1848 | "value": 2500 1849 | } 1850 | ] 1851 | }, 1852 | { 1853 | "matcher": { 1854 | "id": "byName", 1855 | "options": "Dissolved Silica" 1856 | }, 1857 | "properties": [ 1858 | { 1859 | "id": "max", 1860 | "value": 250000 1861 | } 1862 | ] 1863 | }, 1864 | { 1865 | "matcher": { 1866 | "id": "byName", 1867 | "options": "Black Powder" 1868 | }, 1869 | "properties": [ 1870 | { 1871 | "id": "max", 1872 | "value": 1000 1873 | } 1874 | ] 1875 | }, 1876 | { 1877 | "matcher": { 1878 | "id": "byName", 1879 | "options": "Thermal Propulsion Rocket" 1880 | }, 1881 | "properties": [ 1882 | { 1883 | "id": "max", 1884 | "value": 250 1885 | } 1886 | ] 1887 | }, 1888 | { 1889 | "matcher": { 1890 | "id": "byName", 1891 | "options": "Alien Protein" 1892 | }, 1893 | "properties": [ 1894 | { 1895 | "id": "max", 1896 | "value": 500 1897 | } 1898 | ] 1899 | }, 1900 | { 1901 | "matcher": { 1902 | "id": "byName", 1903 | "options": "Hog Remains" 1904 | }, 1905 | "properties": [ 1906 | { 1907 | "id": "max", 1908 | "value": 250 1909 | } 1910 | ] 1911 | }, 1912 | { 1913 | "matcher": { 1914 | "id": "byName", 1915 | "options": "Spitter Remains" 1916 | }, 1917 | "properties": [ 1918 | { 1919 | "id": "max", 1920 | "value": 250 1921 | } 1922 | ] 1923 | }, 1924 | { 1925 | "matcher": { 1926 | "id": "byName", 1927 | "options": "Mycelia" 1928 | }, 1929 | "properties": [ 1930 | { 1931 | "id": "max", 1932 | "value": 1000 1933 | } 1934 | ] 1935 | }, 1936 | { 1937 | "matcher": { 1938 | "id": "byName", 1939 | "options": "Chainsaw" 1940 | }, 1941 | "properties": [ 1942 | { 1943 | "id": "max", 1944 | "value": 5 1945 | } 1946 | ] 1947 | }, 1948 | { 1949 | "matcher": { 1950 | "id": "byName", 1951 | "options": "Xeno-Basher" 1952 | }, 1953 | "properties": [ 1954 | { 1955 | "id": "max", 1956 | "value": 5 1957 | } 1958 | ] 1959 | }, 1960 | { 1961 | "matcher": { 1962 | "id": "byName", 1963 | "options": "Jetpack" 1964 | }, 1965 | "properties": [ 1966 | { 1967 | "id": "max", 1968 | "value": 5 1969 | } 1970 | ] 1971 | }, 1972 | { 1973 | "matcher": { 1974 | "id": "byName", 1975 | "options": "Gas Filter" 1976 | }, 1977 | "properties": [ 1978 | { 1979 | "id": "max", 1980 | "value": 250 1981 | } 1982 | ] 1983 | }, 1984 | { 1985 | "matcher": { 1986 | "id": "byName", 1987 | "options": "Fabric" 1988 | }, 1989 | "properties": [ 1990 | { 1991 | "id": "max", 1992 | "value": 500 1993 | } 1994 | ] 1995 | }, 1996 | { 1997 | "matcher": { 1998 | "id": "byName", 1999 | "options": "Hoverpack" 2000 | }, 2001 | "properties": [ 2002 | { 2003 | "id": "max", 2004 | "value": 5 2005 | } 2006 | ] 2007 | }, 2008 | { 2009 | "matcher": { 2010 | "id": "byName", 2011 | "options": "Ballistic Warp Drive" 2012 | }, 2013 | "properties": [ 2014 | { 2015 | "id": "max", 2016 | "value": 250 2017 | } 2018 | ] 2019 | }, 2020 | { 2021 | "matcher": { 2022 | "id": "byName", 2023 | "options": "Singularity Cell" 2024 | }, 2025 | "properties": [ 2026 | { 2027 | "id": "max", 2028 | "value": 250 2029 | } 2030 | ] 2031 | }, 2032 | { 2033 | "matcher": { 2034 | "id": "byName", 2035 | "options": "Ficsonium Fuel Rod" 2036 | }, 2037 | "properties": [ 2038 | { 2039 | "id": "max", 2040 | "value": 250 2041 | } 2042 | ] 2043 | }, 2044 | { 2045 | "matcher": { 2046 | "id": "byName", 2047 | "options": "Ficsonium" 2048 | }, 2049 | "properties": [ 2050 | { 2051 | "id": "max", 2052 | "value": 500 2053 | } 2054 | ] 2055 | }, 2056 | { 2057 | "matcher": { 2058 | "id": "byName", 2059 | "options": "Alien DNA Capsule" 2060 | }, 2061 | "properties": [ 2062 | { 2063 | "id": "max", 2064 | "value": 250 2065 | } 2066 | ] 2067 | }, 2068 | { 2069 | "matcher": { 2070 | "id": "byName", 2071 | "options": "Hatcher Remains" 2072 | }, 2073 | "properties": [ 2074 | { 2075 | "id": "max", 2076 | "value": 250 2077 | } 2078 | ] 2079 | }, 2080 | { 2081 | "matcher": { 2082 | "id": "byName", 2083 | "options": "Stinger Remains" 2084 | }, 2085 | "properties": [ 2086 | { 2087 | "id": "max", 2088 | "value": 250 2089 | } 2090 | ] 2091 | }, 2092 | { 2093 | "matcher": { 2094 | "id": "byName", 2095 | "options": "Zipline" 2096 | }, 2097 | "properties": [ 2098 | { 2099 | "id": "max", 2100 | "value": 5 2101 | } 2102 | ] 2103 | }, 2104 | { 2105 | "matcher": { 2106 | "id": "byName", 2107 | "options": "Blade Runners" 2108 | }, 2109 | "properties": [ 2110 | { 2111 | "id": "max", 2112 | "value": 5 2113 | } 2114 | ] 2115 | }, 2116 | { 2117 | "matcher": { 2118 | "id": "byName", 2119 | "options": "Parachute" 2120 | }, 2121 | "properties": [ 2122 | { 2123 | "id": "max", 2124 | "value": 5 2125 | } 2126 | ] 2127 | }, 2128 | { 2129 | "matcher": { 2130 | "id": "byName", 2131 | "options": "Nobelisk Detonator" 2132 | }, 2133 | "properties": [ 2134 | { 2135 | "id": "max", 2136 | "value": 5 2137 | } 2138 | ] 2139 | }, 2140 | { 2141 | "matcher": { 2142 | "id": "byName", 2143 | "options": "Nobelisk" 2144 | }, 2145 | "properties": [ 2146 | { 2147 | "id": "max", 2148 | "value": 250 2149 | } 2150 | ] 2151 | }, 2152 | { 2153 | "matcher": { 2154 | "id": "byName", 2155 | "options": "Pulse Nobelisk" 2156 | }, 2157 | "properties": [ 2158 | { 2159 | "id": "max", 2160 | "value": 250 2161 | } 2162 | ] 2163 | }, 2164 | { 2165 | "matcher": { 2166 | "id": "byName", 2167 | "options": "Cluster Nobelisk" 2168 | }, 2169 | "properties": [ 2170 | { 2171 | "id": "max", 2172 | "value": 250 2173 | } 2174 | ] 2175 | }, 2176 | { 2177 | "matcher": { 2178 | "id": "byName", 2179 | "options": "Nuke Nobelisk" 2180 | }, 2181 | "properties": [ 2182 | { 2183 | "id": "max", 2184 | "value": 250 2185 | } 2186 | ] 2187 | }, 2188 | { 2189 | "matcher": { 2190 | "id": "byName", 2191 | "options": "Gas Nobelisk" 2192 | }, 2193 | "properties": [ 2194 | { 2195 | "id": "max", 2196 | "value": 250 2197 | } 2198 | ] 2199 | }, 2200 | { 2201 | "matcher": { 2202 | "id": "byName", 2203 | "options": "Gas Mask" 2204 | }, 2205 | "properties": [ 2206 | { 2207 | "id": "max", 2208 | "value": 5 2209 | } 2210 | ] 2211 | }, 2212 | { 2213 | "matcher": { 2214 | "id": "byName", 2215 | "options": "Smokeless Powder" 2216 | }, 2217 | "properties": [ 2218 | { 2219 | "id": "max", 2220 | "value": 500 2221 | } 2222 | ] 2223 | } 2224 | ] 2225 | }, 2226 | "overrides": [] 2227 | }, 2228 | "gridPos": { 2229 | "h": 13, 2230 | "w": 7, 2231 | "x": 10, 2232 | "y": 0 2233 | }, 2234 | "id": 1, 2235 | "options": { 2236 | "displayMode": "lcd", 2237 | "maxVizHeight": 300, 2238 | "minVizHeight": 16, 2239 | "minVizWidth": 8, 2240 | "namePlacement": "auto", 2241 | "orientation": "horizontal", 2242 | "reduceOptions": { 2243 | "calcs": ["lastNotNull"], 2244 | "fields": "", 2245 | "values": false 2246 | }, 2247 | "showUnfilled": true, 2248 | "sizing": "auto", 2249 | "valueMode": "color" 2250 | }, 2251 | "pluginVersion": "11.2.0", 2252 | "targets": [ 2253 | { 2254 | "datasource": { 2255 | "type": "prometheus", 2256 | "uid": "adyhxpuakmrcwf" 2257 | }, 2258 | "disableTextWrap": false, 2259 | "editorMode": "builder", 2260 | "exemplar": false, 2261 | "expr": "sort_desc(depot)", 2262 | "fullMetaSearch": false, 2263 | "includeNullMetadata": true, 2264 | "instant": true, 2265 | "legendFormat": "{{item}}", 2266 | "range": false, 2267 | "refId": "A", 2268 | "useBackend": false 2269 | } 2270 | ], 2271 | "title": "Dimensional Depots", 2272 | "type": "bargauge" 2273 | }, 2274 | { 2275 | "datasource": { 2276 | "default": true, 2277 | "type": "prometheus", 2278 | "uid": "adyhxpuakmrcwf" 2279 | }, 2280 | "fieldConfig": { 2281 | "defaults": { 2282 | "color": { 2283 | "fixedColor": "#727273", 2284 | "mode": "fixed" 2285 | }, 2286 | "custom": { 2287 | "axisBorderShow": false, 2288 | "axisCenteredZero": false, 2289 | "axisColorMode": "text", 2290 | "axisLabel": "", 2291 | "axisPlacement": "auto", 2292 | "barAlignment": 0, 2293 | "barWidthFactor": 0.6, 2294 | "drawStyle": "line", 2295 | "fillOpacity": 0, 2296 | "gradientMode": "none", 2297 | "hideFrom": { 2298 | "legend": false, 2299 | "tooltip": false, 2300 | "viz": false 2301 | }, 2302 | "insertNulls": false, 2303 | "lineInterpolation": "linear", 2304 | "lineWidth": 1, 2305 | "pointSize": 5, 2306 | "scaleDistribution": { 2307 | "type": "linear" 2308 | }, 2309 | "showPoints": "auto", 2310 | "spanNulls": false, 2311 | "stacking": { 2312 | "group": "A", 2313 | "mode": "none" 2314 | }, 2315 | "thresholdsStyle": { 2316 | "mode": "off" 2317 | } 2318 | }, 2319 | "mappings": [], 2320 | "min": 0, 2321 | "thresholds": { 2322 | "mode": "absolute", 2323 | "steps": [ 2324 | { 2325 | "color": "green", 2326 | "value": null 2327 | } 2328 | ] 2329 | } 2330 | }, 2331 | "overrides": [ 2332 | { 2333 | "matcher": { 2334 | "id": "byName", 2335 | "options": "Points Per Minute" 2336 | }, 2337 | "properties": [ 2338 | { 2339 | "id": "color", 2340 | "value": { 2341 | "fixedColor": "#a779a7", 2342 | "mode": "fixed" 2343 | } 2344 | } 2345 | ] 2346 | } 2347 | ] 2348 | }, 2349 | "gridPos": { 2350 | "h": 7, 2351 | "w": 7, 2352 | "x": 17, 2353 | "y": 0 2354 | }, 2355 | "id": 4, 2356 | "options": { 2357 | "legend": { 2358 | "calcs": [], 2359 | "displayMode": "list", 2360 | "placement": "bottom", 2361 | "showLegend": true 2362 | }, 2363 | "tooltip": { 2364 | "mode": "single", 2365 | "sort": "none" 2366 | } 2367 | }, 2368 | "targets": [ 2369 | { 2370 | "datasource": { 2371 | "type": "prometheus", 2372 | "uid": "adyhxpuakmrcwf" 2373 | }, 2374 | "disableTextWrap": false, 2375 | "editorMode": "code", 2376 | "expr": "(-1 * idelta(points_to_next_coupon[10s])) * 12", 2377 | "fullMetaSearch": false, 2378 | "includeNullMetadata": true, 2379 | "instant": false, 2380 | "interval": "", 2381 | "legendFormat": "Points Per Minute", 2382 | "range": true, 2383 | "refId": "A", 2384 | "useBackend": false 2385 | }, 2386 | { 2387 | "datasource": { 2388 | "type": "prometheus", 2389 | "uid": "adyhxpuakmrcwf" 2390 | }, 2391 | "disableTextWrap": false, 2392 | "editorMode": "builder", 2393 | "expr": "points_to_next_coupon", 2394 | "fullMetaSearch": false, 2395 | "hide": false, 2396 | "includeNullMetadata": true, 2397 | "instant": false, 2398 | "interval": "", 2399 | "legendFormat": "Points Until Next Coupon", 2400 | "range": true, 2401 | "refId": "B", 2402 | "useBackend": false 2403 | } 2404 | ], 2405 | "title": "AWESOME Points", 2406 | "type": "timeseries" 2407 | }, 2408 | { 2409 | "datasource": { 2410 | "default": true, 2411 | "type": "prometheus", 2412 | "uid": "adyhxpuakmrcwf" 2413 | }, 2414 | "fieldConfig": { 2415 | "defaults": { 2416 | "color": { 2417 | "fixedColor": "#5dafc5", 2418 | "mode": "fixed" 2419 | }, 2420 | "mappings": [], 2421 | "thresholds": { 2422 | "mode": "absolute", 2423 | "steps": [ 2424 | { 2425 | "color": "green", 2426 | "value": null 2427 | } 2428 | ] 2429 | } 2430 | }, 2431 | "overrides": [] 2432 | }, 2433 | "gridPos": { 2434 | "h": 6, 2435 | "w": 7, 2436 | "x": 17, 2437 | "y": 7 2438 | }, 2439 | "id": 5, 2440 | "options": { 2441 | "colorMode": "value", 2442 | "graphMode": "area", 2443 | "justifyMode": "auto", 2444 | "orientation": "auto", 2445 | "percentChangeColorMode": "standard", 2446 | "reduceOptions": { 2447 | "calcs": ["lastNotNull"], 2448 | "fields": "", 2449 | "values": false 2450 | }, 2451 | "showPercentChange": false, 2452 | "textMode": "auto", 2453 | "wideLayout": true 2454 | }, 2455 | "pluginVersion": "11.2.0", 2456 | "targets": [ 2457 | { 2458 | "datasource": { 2459 | "type": "prometheus", 2460 | "uid": "adyhxpuakmrcwf" 2461 | }, 2462 | "disableTextWrap": false, 2463 | "editorMode": "code", 2464 | "expr": "coupons + ignoring(item) depot{item=\"FICSIT Coupon\"}", 2465 | "fullMetaSearch": false, 2466 | "hide": false, 2467 | "includeNullMetadata": true, 2468 | "instant": false, 2469 | "legendFormat": "Total", 2470 | "range": true, 2471 | "refId": "A", 2472 | "useBackend": false 2473 | }, 2474 | { 2475 | "datasource": { 2476 | "type": "prometheus", 2477 | "uid": "adyhxpuakmrcwf" 2478 | }, 2479 | "disableTextWrap": false, 2480 | "editorMode": "builder", 2481 | "exemplar": false, 2482 | "expr": "coupons", 2483 | "format": "time_series", 2484 | "fullMetaSearch": false, 2485 | "hide": false, 2486 | "includeNullMetadata": true, 2487 | "instant": false, 2488 | "legendFormat": "Pending", 2489 | "range": true, 2490 | "refId": "B", 2491 | "useBackend": false 2492 | } 2493 | ], 2494 | "title": "FICSIT Coupons", 2495 | "type": "stat" 2496 | }, 2497 | { 2498 | "datasource": { 2499 | "default": true, 2500 | "type": "prometheus", 2501 | "uid": "adyhxpuakmrcwf" 2502 | }, 2503 | "fieldConfig": { 2504 | "defaults": { 2505 | "color": { 2506 | "mode": "palette-classic" 2507 | }, 2508 | "custom": { 2509 | "axisBorderShow": false, 2510 | "axisCenteredZero": false, 2511 | "axisColorMode": "text", 2512 | "axisLabel": "", 2513 | "axisPlacement": "auto", 2514 | "barAlignment": 0, 2515 | "barWidthFactor": 0.6, 2516 | "drawStyle": "line", 2517 | "fillOpacity": 0, 2518 | "gradientMode": "none", 2519 | "hideFrom": { 2520 | "legend": false, 2521 | "tooltip": false, 2522 | "viz": false 2523 | }, 2524 | "insertNulls": false, 2525 | "lineInterpolation": "linear", 2526 | "lineWidth": 1, 2527 | "pointSize": 5, 2528 | "scaleDistribution": { 2529 | "type": "linear" 2530 | }, 2531 | "showPoints": "auto", 2532 | "spanNulls": false, 2533 | "stacking": { 2534 | "group": "A", 2535 | "mode": "none" 2536 | }, 2537 | "thresholdsStyle": { 2538 | "mode": "off" 2539 | } 2540 | }, 2541 | "mappings": [], 2542 | "min": 0, 2543 | "thresholds": { 2544 | "mode": "absolute", 2545 | "steps": [ 2546 | { 2547 | "color": "#727273", 2548 | "value": null 2549 | } 2550 | ] 2551 | } 2552 | }, 2553 | "overrides": [ 2554 | { 2555 | "matcher": { 2556 | "id": "byName", 2557 | "options": "Power Produced" 2558 | }, 2559 | "properties": [ 2560 | { 2561 | "id": "color", 2562 | "value": { 2563 | "fixedColor": "#727273", 2564 | "mode": "fixed" 2565 | } 2566 | } 2567 | ] 2568 | }, 2569 | { 2570 | "matcher": { 2571 | "id": "byName", 2572 | "options": "Power Consumed" 2573 | }, 2574 | "properties": [ 2575 | { 2576 | "id": "color", 2577 | "value": { 2578 | "fixedColor": "#e59344", 2579 | "mode": "fixed" 2580 | } 2581 | } 2582 | ] 2583 | }, 2584 | { 2585 | "matcher": { 2586 | "id": "byName", 2587 | "options": "Max Consumption" 2588 | }, 2589 | "properties": [ 2590 | { 2591 | "id": "color", 2592 | "value": { 2593 | "fixedColor": "#5cb0c5", 2594 | "mode": "fixed" 2595 | } 2596 | } 2597 | ] 2598 | }, 2599 | { 2600 | "matcher": { 2601 | "id": "byName", 2602 | "options": "Power Capacity" 2603 | }, 2604 | "properties": [ 2605 | { 2606 | "id": "color", 2607 | "value": { 2608 | "fixedColor": "#cfcece", 2609 | "mode": "fixed" 2610 | } 2611 | } 2612 | ] 2613 | } 2614 | ] 2615 | }, 2616 | "gridPos": { 2617 | "h": 9, 2618 | "w": 24, 2619 | "x": 0, 2620 | "y": 13 2621 | }, 2622 | "id": 2, 2623 | "options": { 2624 | "legend": { 2625 | "calcs": [], 2626 | "displayMode": "list", 2627 | "placement": "bottom", 2628 | "showLegend": true 2629 | }, 2630 | "tooltip": { 2631 | "mode": "single", 2632 | "sort": "none" 2633 | } 2634 | }, 2635 | "targets": [ 2636 | { 2637 | "datasource": { 2638 | "type": "prometheus", 2639 | "uid": "adyhxpuakmrcwf" 2640 | }, 2641 | "disableTextWrap": false, 2642 | "editorMode": "builder", 2643 | "expr": "power_produced", 2644 | "fullMetaSearch": false, 2645 | "includeNullMetadata": true, 2646 | "instant": false, 2647 | "legendFormat": "Power Produced", 2648 | "range": true, 2649 | "refId": "Power Produced", 2650 | "useBackend": false 2651 | }, 2652 | { 2653 | "datasource": { 2654 | "type": "prometheus", 2655 | "uid": "adyhxpuakmrcwf" 2656 | }, 2657 | "disableTextWrap": false, 2658 | "editorMode": "builder", 2659 | "expr": "power_consumed", 2660 | "fullMetaSearch": false, 2661 | "hide": false, 2662 | "includeNullMetadata": true, 2663 | "instant": false, 2664 | "legendFormat": "Power Consumed", 2665 | "range": true, 2666 | "refId": "Power Consumed", 2667 | "useBackend": false 2668 | }, 2669 | { 2670 | "datasource": { 2671 | "type": "prometheus", 2672 | "uid": "adyhxpuakmrcwf" 2673 | }, 2674 | "disableTextWrap": false, 2675 | "editorMode": "builder", 2676 | "expr": "maximum_power_consumption", 2677 | "fullMetaSearch": false, 2678 | "hide": false, 2679 | "includeNullMetadata": true, 2680 | "instant": false, 2681 | "legendFormat": "Max Consumption", 2682 | "range": true, 2683 | "refId": "Max Consumption", 2684 | "useBackend": false 2685 | }, 2686 | { 2687 | "datasource": { 2688 | "type": "prometheus", 2689 | "uid": "adyhxpuakmrcwf" 2690 | }, 2691 | "disableTextWrap": false, 2692 | "editorMode": "builder", 2693 | "expr": "power_production_capacity", 2694 | "fullMetaSearch": false, 2695 | "hide": false, 2696 | "includeNullMetadata": true, 2697 | "instant": false, 2698 | "legendFormat": "Power Capacity", 2699 | "range": true, 2700 | "refId": "Power Capacity", 2701 | "useBackend": false 2702 | } 2703 | ], 2704 | "title": "Power Consumption", 2705 | "type": "timeseries" 2706 | } 2707 | ], 2708 | "refresh": "5s", 2709 | "schemaVersion": 39, 2710 | "tags": [], 2711 | "templating": { 2712 | "list": [] 2713 | }, 2714 | "time": { 2715 | "from": "now-6h", 2716 | "to": "now" 2717 | }, 2718 | "timepicker": {}, 2719 | "timezone": "browser", 2720 | "title": "Statisfactory", 2721 | "uid": "fdyhzb7pkn7y8b", 2722 | "version": 24, 2723 | "weekStart": "" 2724 | } 2725 | --------------------------------------------------------------------------------