diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 2371772eb..3e844e8af 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -5,5 +5,4 @@
/src/en/templates/ @moonheart08
/src/en/proposals/ @jezithyr
/src/en/templates/ @jezithyr
-/src/en/space-station-14/core-design @jezithyr
/src/ru/* @ficcialfaint
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 8e7389a90..7c6022c03 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -10,5 +10,30 @@
"Scripts":
- 'scripts/**'
+# I have tried making this robust (tm) using wildcards so many times but github docs for the labeler SUUUUCK. If you got time to figure it out please do it I give up.
+# Welcome to the mega labeler.
"Design":
-- 'src/en/proposals/**'
+# General design
+- 'src/en/space-station-14/accessibility/proposals/**'
+- 'src/en/space-station-14/admin-tools/proposals/**'
+- 'src/en/space-station-14/art/proposals/**'
+- 'src/en/space-station-14/character-species/proposals/**'
+- 'src/en/space-station-14/combat/proposals/**'
+- 'src/en/space-station-14/mapping/proposals/**'
+- 'src/en/space-station-14/player-interaction/proposals/**'
+- 'src/en/space-station-14/roleplay-lore/proposals/**'
+- 'src/en/space-station-14/round-flow/proposals/**'
+- 'src/en/space-station-14/user-interface/proposals/**'
+
+# Department design
+- 'src/en/space-station-14/departments/atmos/proposals/**'
+- 'src/en/space-station-14/departments/cargo-salvage/proposals/**'
+- 'src/en/space-station-14/departments/command/proposals/**'
+- 'src/en/space-station-14/departments/engineering/proposals/**'
+- 'src/en/space-station-14/departments/medical/proposals/**'
+- 'src/en/space-station-14/departments/science/proposals/**'
+- 'src/en/space-station-14/departments/security/proposals/**'
+- 'src/en/space-station-14/departments/service/proposals/**'
+
+# General proposals
+- 'src/en/general-proposals/**'
diff --git a/.gitignore b/.gitignore
index d47934e47..fa0a061c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,6 @@
book
.idea/
+
+# editor files
+.*~
+*.swp
diff --git a/README.md b/README.md
index b507cdb27..1fc0fa92c 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,15 @@
# Space Wizards Development Wiki
-This is a port of the old Wiki.js SS14 documentation to `mdbook`, for the following benefits:
+This is the `mdbook`-based developer documentation for all Space Wizards projects, including Robust Toolbox, Space Station 14, the SS14 launcher, etc. These docs cover many topics and can be potentially very useful for mappers, spriters, active contributors & prospective contributors, people who want to use our engine for their own projects, fork developers, and so on.
+
+The site is currently hosted at [https://docs.spacestation14.com](https://docs.spacestation14.com).
+
+Benefits of the current docs site infrastructure include:
- First-class git support, open source and actually editable by everyone
-- No webshit bloat, much faster in general
-- More familiar & comfortable for developers since `mdbook` use is very widespread
-- No sign-on infrastructure or hosting necessary (besides GH pages)
-- More customizable
-- Friction to editing reduced significantly
+- Decently familiar & comfortable for developers since `mdbook` use is very widespread
+- No sign-on infrastructure or hosting necessary (besides GH pages), if forks would like to host their own
+- Very low friction to adding new pages and editing/fixing old ones
+- High level of customizability with styling and easy custom scripting
- Eventual localization support
The following `mdbook` features & plugins are available and in use:
@@ -18,8 +21,6 @@ The following `mdbook` features & plugins are available and in use:
- `mdbook-admonish`
- `mdbook-emojicodes`
-The site is currently hosted at [https://docs.spacestation14.com](https://docs.spacestation14.com).
-
**For information such as how to edit, build & test these docs, see [Guide to Editing Docs](https://spacestation14.io/docs/en/meta/guide-to-editing-docs.html). on the site itself** (or [in this repo](./src/en/meta/guide-to-editing-docs.md))
## Screenshots
diff --git a/book.toml b/book.toml
index d8214035a..24d3c9561 100644
--- a/book.toml
+++ b/book.toml
@@ -56,13 +56,21 @@ warning-policy = "ignore" # false-positives like hell with absolute links & late
"/en/content/yaml/index.html" = "/en/general-development/tips/yaml-crash-course.html"
"/en/getting-started/pr-guideline/index.html" = "/en/general-development/codebase-info/pull-request-guidelines.html"
"/en/getting-started/conventions/index.html" = "/en/general-development/codebase-info/conventions.html"
-"/en/content/chemistry/index.html" = "/en/space-station-14/chemistry.html"
"/en/content/writing-guidebook-entries/index.html" = "/en/general-development/tips/writing-guidebook-entries.html"
-"/en/content/device-network/index.html" = "/en/space-station-14/device-network.html"
-"/en/content/pow3r/index.html" = "/en/spcae-station-14/pow3r.html"
+"/en/content/device-network/index.html" = "/en/space-station-14/core-tech/device-network.html"
+"/en/content/pow3r/index.html" = "/en/spcae-station-14/departments/engineering/pow3r.html"
# yes this one is correct
-"/en/content/construction/index/index.html" = "/en/space-station-14/construction.html"
-"/en/content/destructible/index.html" = "/en/space-station-14/destructible.html"
+"/en/content/construction/index/index.html" = "/en/space-station-14/core-tech/construction.html"
+"/en/content/destructible/index.html" = "/en/space-station-14/core-tech/destructible.html"
+"/en/content/mapping/index.html" = "/en/space-station-14/mapping/guides/general-guide.html"
+"/en/content/mapping-sins/index.html" = "/en/space-station-14/mapping/guidelines.html"
+"/en/content/mapping-checklist/index.html" = "/en/space-station-14/mapping/guidelines.html"
+"/en/content/dungeons/index.html" = "/en/space-station-14/mapping/dungeons.html"
+"/en/content/node-networks/index.html" = "/en/space-station-14/core-tech/node-networks.html"
+"/en/content/NPCs/index.html" = "/en/space-station-14/core-tech/npcs.html"
+"/en/content/cartridge-loader/index.html" = "/en/space-station-14/player-interaction/cartridge-loaders.html"
+"/en/content/chemistry/index.html" = "/en/space-station-14/core-tech/chemistry.html"
+
"/en/administration/commands/index.html" = "/en/community/admin/admin-tooling/admin-command-cookbook.html"
"/en/administration/tooling/index.html" = "/en/community/admin/admin-tooling.html"
"/en/administration/policy/index.html" = "/en/community/admin/wizards-den-admin-policy.html"
@@ -80,13 +88,6 @@ warning-policy = "ignore" # false-positives like hell with absolute links & late
"/en/getting-started/troubleshooting/index.html" = "/en/general-development/tips/troubleshooting-faq.html"
"/en/config-reference/index.html" = "/en/general-development/tips/config-file-reference.html"
"/en/technical-docs/codebase-organization/index.html" = "/en/general-development/codebase-info/codebase-organization.html"
-"/en/content/mapping/index.html" = "/en/space-station-14/mapping.html"
-"/en/content/mapping-sins/index.html" = "/en/space-station-14/mapping/mapping-sins.html"
-"/en/content/mapping-checklist/index.html" = "/en/space-station-14/mapping/mapping-checklist.html"
-"/en/content/dungeons/index.html" = "/en/space-station-14/dungeons.html"
-"/en/content/node-networks/index.html" = "/en/space-station-14/node-networks.html"
-"/en/content/NPCs/index.html" = "/en/space-station-14/npcs.html"
-"/en/content/cartridge-loader/index.html" = "/en/space-station-14/cartridge-loaders.html"
"/en/engine/ecs/index.html" = "/en/robust-toolbox/ecs.html"
"/en/engine/coordinate-systems/index.html" = "/en/robust-toolbox/coordinate-systems.html"
"/en/engine/net-entities/index.html" = "/en/robust-toolbox/netcode/net-entities.html"
diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index 97d2c279b..d44070d9d 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -35,9 +35,10 @@ General Development
- [Config File Reference](en/general-development/tips/config-file-reference.md)
- [YAML Crash Course](en/general-development/tips/yaml-crash-course.md)
- [Feature Proposals](en/general-development/feature-proposals.md)
+ - [Feature Proposal Template](en/templates/proposal.md)
- [Expected Team Decorum & Usage](en/general-development/feature-proposals/expected-feature-proposal-decorum.md)
- - [Core Game Design](en/space-station-14/core-design.md)
-
+- [Work Groups](en/general-development/work-groups.md)
+- [Contributing Translations](en/general-development/contributing-translations.md)
SS14 By Example
===============
@@ -93,56 +94,163 @@ Robust Toolbox
- [MIDI](en/robust-toolbox/midi.md)
- [Automatic Client Zip (ACZ)](en/robust-toolbox/acz.md)
- [Asset Packaging](en/robust-toolbox/asset-packaging.md)
-- [Publishing a new version](en/robust-toolbox/publishing-robusttoolbox.md)
+- [Publishing a new Robust Toolbox Version](en/robust-toolbox/publishing-robusttoolbox.md)
Space Station 14
================
----------------------
-- [Core Game Design](en/space-station-14/core-design.md)
- - [Design Principles](en/space-station-14/core-design/principles.md)
- - [Antagonists](en/space-station-14/core-design/antagonists.md)
-- [Mapping](en/space-station-14/mapping.md)
- - [Mapping Checklist](en/space-station-14/mapping/mapping-checklist.md)
- - [Mapping Sins](en/space-station-14/mapping/mapping-sins.md)
-- [Chemistry](en/space-station-14/chemistry.md)
- - [Solution Containers](en/space-station-14/chemistry/solution-containers.md)
- - [Reagents](en/space-station-14/chemistry/reagents.md)
- - [Metabolism](en/space-station-14/chemistry/metabolism.md)
- - [Reactions](en/space-station-14/chemistry/reactions.md)
-- [Construction](en/space-station-14/construction.md)
-- [Destructible](en/space-station-14/destructible.md)
-- [Device Network](en/space-station-14/device-network.md)
-- [Pow3r](en/space-station-14/pow3r.md)
-- [Cartridge Loaders](en/space-station-14/cartridge-loaders.md)
-- [Node Networks](en/space-station-14/node-networks.md)
-- [Dungeons](en/space-station-14/dungeons.md)
-- [NPCs](en/space-station-14/npcs.md)
-
-Design Proposals
-================
-----------------------
+- [Core Design](en/space-station-14/core-design.md)
+ - [Design Principles](en/space-station-14/core-design/design-principles.md)
+
+- [Core Tech]()
+ - [PR Guidelines](en/space-station-14/core-tech/guidelines.md)
+
+ - [Destructible](en/space-station-14/core-tech/destructible.md)
+ - [Construction](en/space-station-14/core-tech/construction.md)
+ - [Node Networks](en/space-station-14/core-tech/node-networks.md)
+ - [Displacement Maps](en/space-station-14/art/displacement-maps.md)
+ - [Device Network](en/space-station-14/core-tech/device-network.md)
+ - [NPCs](en/space-station-14/core-tech/npcs.md)
+ - [Chemistry](en/space-station-14/core-tech/chemistry.md)
+ - [Metabolism](en/space-station-14/core-tech/chemistry/metabolism.md)
+ - [Reactions](en/space-station-14/core-tech/chemistry/reactions.md)
+ - [Reagents](en/space-station-14/core-tech/chemistry/reagents.md)
+ - [Solution Containers](en/space-station-14/core-tech/chemistry/solution-containers.md)
+
+ - [Proposals]()
+
+- [Accessibility](en/space-station-14/accessibility.md)
+ - [PR Guidelines](en/space-station-14/accessibility/guidelines.md)
+
+ - [Proposals]()
+
+- [Admin Tooling](en/space-station-14/admin-tools.md)
+ - [PR Guidelines](en/space-station-14/admin-tools/guidelines.md)
+
+ - [Proposals]()
+
+- [Art](en/space-station-14/art.md)
+ - [PR Guidelines](en/space-station-14/art/guidelines.md)
+
+ - [Proposals]()
+
+- [Character/Species](en/space-station-14/characters-species.md)
+ - [PR Guidelines](en/space-station-14/character-species/guidelines.md)
+
+ - [Proposals]()
+
+- [Combat](en/space-station-14/combat.md)
+ - [PR Guidelines](en/space-station-14/combat/guidelines.md)
+
+ - [Proposals]()
-- [Feature Proposal Template](en/templates/proposal.md)
+- [Mapping](en/space-station-14/mapping.md)
+ - [PR Guidelines](en/space-station-14/mapping/guidelines.md)
+
+ - [Dungeons](en/space-station-14/mapping/dungeons.md)
+
+ - [Guides]()
+ - [General Guide](en/space-station-14/mapping/guides/general-guide.md)
+
+ - [Proposals]()
+
+- [Player Interaction](en/space-station-14/player-interaction.md)
+ - [PR Guidelines](en/space-station-14/player-interaction/guidelines.md)
+
+ - [Cartridge loaders](en/space-station-14/player-interaction/cartridge-loaders.md)
+
+ - [Proposals]()
+ - [PAI Expansion Slots](en/space-station-14/player-interaction/proposals/pai-expansion-slots.md)
+ - [PDA Messaging](en/space-station-14/player-interaction/proposals/pda-messaging.md)
+ - [Grid Inventory](en/space-station-14/player-interaction/proposals/grid-inventory.md)
+
+- [Roleplay/Lore](en/space-station-14/roleplay-lore.md)
+ - [PR Guidelines](en/space-station-14/roleplay-lore/guidelines.md)
+
+ - [Proposals]()
+
+- [Roundflow](en/space-station-14/round-flow.md)
+ - [PR Guidelines](en/space-station-14/round-flow/guidelines.md)
+
+ - [Antagonists](en/space-station-14/round-flow/antagonists.md)
+ - [Exterimator](en/space-station-14/round-flow/antagonists/exterminator.md)
+ - [Thief](en/space-station-14/round-flow/antagonists/thief.md)
+
+ - [Proposals]()
+ - [Cleanup Crew Gamemode](en/space-station-14/round-flow/proposals/cleanup-crew-gamemode.md)
+ - [Game Director](en/space-station-14/round-flow/proposals/game-director.md)
+ - [Pizza Delivery Critter](en/space-station-14/round-flow/proposals/pizza-delivery-critter.md)
+ - [Rogue Drones](en/space-station-14/round-flow/proposals/rogue-drones.md)
+ - [Turf War](en/space-station-14/round-flow/proposals/turf-war.md)
+
+- [User Interface](en/space-station-14/user-interface.md)
+ - [PR Guidelines](en/space-station-14/user-interface/guidelines.md)
+
+ - [Proposals]()
+ - [Stat Panels](en/space-station-14/user-interface/proposals/statpanels.md)
+- [Departments](en/space-station-14/departments.md)
+ - [Atmos](en/space-station-14/departments/atmos.md)
+ - [PR Guidelines](en/space-station-14/departments/atmos/guidelines.md)
+
+ - [Proposals]()
+ - [Atmos Rework](en/space-station-14/departments/atmos/proposals/atmos-rework.md)
+
+ - [Cargo/Salvage](en/space-station-14/departments/cargo-salvage.md)
+ - [PR Guidelines](en/space-station-14/departments/cargo-salvage/guidelines.md)
+
+ - [Proposals]()
+ - [Salvage Proposal](en/space-station-14/departments/cargo-salvage/proposals/salvage-proposal.md)
+
+ - [Command](en/space-station-14/departments/command.md)
+ - [PR Guidelines](en/space-station-14/departments/command/guidelines.md)
+ - [Proposals]()
+
+ - [Engineering](en/space-station-14/departments/engineering.md)
+ - [PR Guidelines](en/space-station-14/departments/engineering/guidelines.md)
+
+ - [Machine Upgrading Rework](en/space-station-14/departments/engineering/proposals/machine-upgrading-rework.md)
+ - [Pow3r](en/space-station-14/departments/engineering/pow3r.md)
+
+ - [Proposals]()
+ - [Engine Containment](en/space-station-14/departments/engineering/proposals/engine-containment.md)
+ - [Machine Upgrading Rework](en/space-station-14/departments/engineering/proposals/machine-upgrading-rework.md)
+ - [Power Generation Rework](en/space-station-14/departments/engineering/proposals/power-generation.md)
+ - [Signaller Rework](en/space-station-14/departments/engineering/proposals/signaller-rework.md)
+
+ - [Medical](en/space-station-14/departments/medical.md)
+ - [PR Guidelines](en/space-station-14/departments/medical/guidelines.md)
+
+ - [Proposals]()
+
+ - [Science](en/space-station-14/departments/science.md)
+ - [PR Guidelines](en/space-station-14/departments/science/guidelines.md)
+ - [Anomaly Cores](en/space-station-14/departments/science/anomaly-cores.md)
+
+ - [Proposals]()
+ - [XenoArch Redux (3MOArch)](en/space-station-14/departments/science/proposals/xenoarch-redux.md)
+ - [Xenobio](en/space-station-14/departments/science/proposals/xenobio.md)
+
+ - [Security](en/space-station-14/departments/security.md)
+ - [PR Guidelines](en/space-station-14/departments/security/guidelines.md)
+
+ - [Proposals]()
+ - [GenPop Prisoners](en/space-station-14/departments/security/proposals/genpop-prisoners.md)
+ - [Reduced Metagaming Mechanics](en/space-station-14/departments/security/proposals/reduced-metagaming.md)
+ - [Service](en/space-station-14/departments/service.md)
+ - [PR Guidelines](en/space-station-14/departments/service/guidelines.md)
+
+ - [Proposals]()
+ - [Plant Genetics](en/space-station-14/departments/service/proposals/plant-genetics.md)
+ - [Joker Roles](en/space-station-14/departments/service/proposals/joker_roles.md)
+
+General Proposals
+================
----------------------
-- [Anomaly Cores](en/proposals/mirrorcult-anomaly-cores.md)
-- [Machine Upgrading Rework](en/proposals/emogarbage-machine-upgrading-rework.md)
-- [PDA Messaging](en/proposals/julian-vasilis-pda-messaging.md)
-- [Plant Genetics](en/proposals/deltanedas-plant-genetics.md)
-- [Security Genpop Rework](en/proposals/ike709-genpop-security.md)
-- [Rogue Drones](en/proposals/mirrorcult-rogue-drones.md)
-- [Game Director](en/proposals/tomleys-game-director.md)
-- [Grid Inventory](en/proposals/emogarbage-grid-inventory.md)
-- [Atmos Roadmap](en/proposals/notafet-atmos.md)
-- [Cleanup Crew](en/proposals/mirrorcult-cleanup-crew-gamemode.md)
-- [Exterminator](en/proposals/deltanedas-exterminator.md)
-- [Power Generation Pattern](en/proposals/tday93-power-generation.md)
-- [Turf War](en/proposals/deltanedas-turf-war.md)
-- [Signaller Rework](en/proposals/deltanedas-signaller-rework.md)
-- [Thief antagonist](en/proposals/theshued-thief.md)
+- [Robust Hub](en/general-proposals/robusthub.md)
Server Hosting
==============
@@ -189,7 +297,12 @@ Community
- [Grafana Dashboards](en/community/infrastructure-reference/grafana-dashboards.md)
- [Space Wizards Hub Rules](en/community/space-wizards-hub-rules.md)
- [Space Wizards Role Hierarchy](en/community/space-wizards-role-hierarchy.md)
+- [Space Wizards Maintainer List](en/community/space-wizards-maintainer-list.md)
- [Discord Rich Presence Repository](en/community/discord-rich-presence-repository.md)
+- [Project Manager](en/community/projectmanager.md)
+- [Maintainer](en/community/maintainer.md)
+ - [Maintainer Policy](en/community/maintainer/wizards-den-maintainer-policy.md)
+ - [Review Policy](en/community/maintainer/wizards-den-review-policy.md)
- [Admin](en/community/admin.md)
- [Admin Tooling](en/community/admin/admin-tooling.md)
- [Admin Command Cookbook](en/community/admin/admin-tooling/admin-command-cookbook.md)
@@ -217,6 +330,7 @@ Maintainer Meetings
==============
----------------------
+- [2024-04-06](en/maintainer-meetings/maintainer-meeting-2024-04-06.md)
- [2024-03-23](en/maintainer-meetings/maintainer-meeting-2024-03-23.md)
- [2024-02-03](en/maintainer-meetings/maintainer-meeting-2024-02-03.md)
- [2024-01-20](en/maintainer-meetings/maintainer-meeting-2024-01-20.md)
@@ -263,5 +377,9 @@ Admin Meetings
==============
----------------------
-- [2024-02-03](en/admin-meetings/admin-meeting-2024-02-03.md)
+- [2024-05-18](en/admin-meetings/admin-meeting-2024-05-18.md)
+- [2024-04-27](en/admin-meetings/admin-meeting-2024-04-27.md)
+- [2024-03-30](en/admin-meetings/admin-meeting-2024-03-30.md)
+- [2024-03-16](en/admin-meetings/admin-meeting-2024-03-16.md)
- [2024-02-17](en/admin-meetings/admin-meeting-2024-02-17.md)
+- [2024-02-03](en/admin-meetings/admin-meeting-2024-02-03.md)
diff --git a/src/en/admin-meetings/admin-meeting-2024-03-16.md b/src/en/admin-meetings/admin-meeting-2024-03-16.md
new file mode 100644
index 000000000..31a069328
--- /dev/null
+++ b/src/en/admin-meetings/admin-meeting-2024-03-16.md
@@ -0,0 +1,246 @@
+# Admin Meeting 2024-03-16
+
+## Agenda
+
+- Brief updates from last meeting
+- Ghost role antag rolling
+- Async Trialmin Promotions
+- Character Impersonation
+- Early access blocks from admins
+- Reduction votes without reduction times
+- Review minutes
+
+## Topic Details
+
+### Brief updates from last meeting
+
+The last meeting's minutes are available at [link removed]
+
+#### Summary
+
+> It's been a month since the last meeting. Two big things from the last one were SOP and space law. Those changes are awaiting the rest of the rule changes currently being worked on.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+1. Communicate updates related to items from the last meeting to admins attending the meeting.
+
+### Ghost role antag rolling
+
+#### Summary
+
+> Some people are joining multiple servers at once or within a short period, possibly trying to get ghost roles. Some of these people have been banned for antag rolling. It should be kept in mind that there are other reasons people might appear to be doing this. For example, people might observe a server thinking that the round will end soon, perhaps because they checked the round time, but then discover that the station seems fine and the round is unlikely to end soon, so they leave and do the same on another server. People may also be looking for something interesting to observe or participate in.
+>
+> Here are some appeals that I think are related:
+> - [link removed]
+> - [link removed]
+> -Chief_Engineer
+#### Meeting Goals
+The purpose of this topic is to determine the opinions of attending admins on the following questions:
+
+1. If this is a violation of a rule, which rule?
+2. Are any of the following relevant when determining if a situation violates a rule:
+ 1. Whether the player is taking ghost roles or just observing
+ 2. Whether the player is on multiple servers at the simultaniously
+ 3. Whether the player is taking an antag vs non-antag ghost role
+ 4. Whether the player takes roles on the first server vs leaving it without taking a role
+3. If being on multiple servers simultaniously is not required to violate a rule, then to avoid issues, presumably they have to spend a long enough period of time on each server, or a long enough time between leaving one and joining another to avoid issues. Roughly, what are those times?
+4. Is it reasonable for a player who has read the rules to know all of this?
+5. When is it reasonable to ban players for this?
+ 1. Is it reasonable to place a ban without prior warnings specifically for this?
+ 2. Is it reasonable to place a ban without prior warnings specifically for this, but with warnings for typical antag rolling?
+6. Should any of this be against the rules?
+
+### Async Trialmin Promotions
+#### Summary
+
+> We talked about this during the last batch and now we get to again. Typically, trialmin promotions have all happened at once. As groups get bigger, this is less feasible. Voting on all trialmins at once means each candidate is looked over less carefully and specific candidates occasionally draw attention, which may lead to the other candidates being neglected in the discussion. Waiting for all trialmins to be ready to do a vote means some trialmins will be held back for little reason. Asynchronous promotion can cause tension between trialmins. With one vote at a time, doing 48 hour votes for 6 trialmins would take 12 days. With two at a time, it would take almost a week.
+>-Chief_Engineer
+
+#### Meeting Goals
+
+1. Determine the general feelings and concerns of attending admins about asynchronous vs synchronous promotions.
+
+### Character Impersonation
+
+#### Summary
+
+> There are varying levels of impersonation. You can "impersonate" or copy:
+> - Character name
+> - Character appearance
+> - Character personality
+> - Usernames
+> - lookalikes: COOL = C00L
+> - SS13 usernames that aren't taken on SS14
+> - alterations: SomePlayer = SomePlayerOfficial = Some_Player
+>
+> You can also create any combination of those.
+>
+> Impersonating characters outside of SS14 and SS13 is outside the scope of this topic. It is primarily covered by name rules.
+>-Chief_Engineer
+
+#### Meeting Goals
+
+The purpose of this topic is to determine the opinions of attending admins on the following questions:
+
+1. When, if ever, does impersonation become an issue?
+2. Does it make a difference if the impersonation is:
+ 1. Between two wizden players
+ 2. Between a wizden player and a player of another SS14 server
+ 3. Between a wizden player and a player of a SS13 server
+ 4. Impersonation with an OOC component
+ 5. Impersonation paired with an OOC factor, like a feud that does not rise to harassment
+ 6. Impersonation where the goal appears to be to primarily or also impersonate an OOC identity
+3. Partially discuss the real example that CE will share
+
+### Early access blocks from admins
+
+#### Summary
+
+> What do admins feel is necessary prior to leaving playtest? I've been reminded that we're supposed to be tracking this, so I updated the issue, but I want to make sure I'm not missing stuff.
+>
+> These should all be things that are necessary, or nearly necessary, for game admins to handle a significant surge of players and whatever else may come from leaving playtest. While the issue is not specific to admin things, things that are not specifically related to admins are out of scope for this topic.
+>
+> https://github.com/space-wizards/space-station-14/issues/23246
+>-Chief_Engineer
+
+#### Meeting Goals
+
+1. Create a list of things that are necessary, or nearly necessary, for game admins to handle a significant surge of players and whatever else may come from leaving playtest.
+
+### Reduction votes without reduction times
+
+#### Summary
+
+> Can we put what time you want if you vote for reduction, Currently if not one mentions a time it defaults to 1 week. But if someone votes for something like 2 months and there are another 6 admins that did not define something that is a huge difference in reduction. Adding a time would be useful here.
+> Another thing to keep in mind is the ban time. Reductions are a reduction from a indef ban to a set time, not altering the start date of said ban. If they have already been banned for 2 weeks and we reduce to 1 week it was the same as if we had just removed.
+>-Repo
+
+> I think if people don't care enough to write out what they want the reduction to, then there's no issue with however many do care enough from determining the reduction time on their own.
+>
+> For reductions, I don't think it makes sense to reduce from the start of the ban because it makes two of the vote options actually mean the same thing sometimes instead of actually being different options. I think every time I've been asked, I've told people to reduce from the time that the vote was put up.
+>-Chief_Engineer
+
+#### Meeting Goals
+
+1. Determine if admins should be required to specify a reduction time if voting to reduce a ban.
+2. Determine if the time since the ban was placed is something admins are suggested to add to appeal votes.
+
+### Review minutes
+
+#### Summary
+
+> The meeting minutes provide a record of the meeting for those who could not attend, and they are used to action decisions made in the meeting. For these reasons, it is important that they accurately represent what actually happened in the meeting.
+>-Chief_Engineer
+
+#### Meeting Goals
+
+1. Ensure that nothing important is missing or misrepresented in the minutes.
+2. Attempt to ensure that all topics have met their meeting goals. This can be done by ensuring that each meeting goal is directly addressed by the conclusion of the topic's minutes.
+3. Attempt to ensure that all conclusions fit into one of the following categories:
+ 1. Indicate that a meeting goal was completed.
+ 2. Are something actionable, meaning that they not only call for an action, but that action is specific enough that it does not require answering questions like "what exactly needs to be done?" or "how can this be done?"
+ 3. Clearly indicate that the meeting goals for the topic were not met. Examples: the discussion was tabled, the admin team did not reach a conclusion, the admin team was not able to make the conclusion actionable.
+
+```admonish info
+
+## Attendees
+- Chief_Engineer - Headmin
+- Skarlet - Project Manager, Mediator
+- Retequizzle - Project Manager
+- ShadowCommander - Project Manager
+- nikthechampiongr - Propermin, Minutes Editor
+- TurboTracker - Propermin
+- CptJeanLuc - Propermin
+- Repo - Propermin
+- Crazybrain - Propermin
+- Rose - Propermin
+- Sphiral - Propermin
+- Whisper - Propermin
+- Eclipse - Propermin
+- Lucky - Propermin
+- Kezu - Propermin
+- XxSWAG_MASTERxX - Trialmin
+- lunarcomets - Trialmin
+- Geekyhobbo - Trialmin
+
+```
+
+## Minutes
+
+### Brief updates from last meeting
+
+- LRP space law and SOP awaiting rule change.
+
+### Ghost role antag rolling
+
+- Some players tend to hop between servers in order to get ghost roles. This is usually due to them not wanting to play further in a round they are a part of, as well as other reasons. They will also mostly take antag ghost roles, rather than neutral or otherwise passive ghost roles.
+- Players trying to get ghost roles is not against our current rules.
+- Players "antag rolling" for ghost roles do take up server slots as they often stay afk waiting for those roles.
+- This issue could be resolved much more effectively through code. E.g. Stopping stoping from joining multiple servers at once.
+- Rule zero could be considered where players are systematically taking slots in multiple servers at the same time solely for the purpose of becoming ghost antags. This kind of enforcement should ideally be reviewed by a PM, and go through stricter scrutiny than usual.
+- Alternatively we can just enforce that players should not connect to multiple wizden servers at the same time, however this should be solved by code eventually.
+- Any way of dealing with this through moderation will take up a lot of admin resources that may not be worth it.
+- Players should not be expected to know this is being enforced. As such should we moderate this behavior in any way, at most we should warn players doing this if they present no other issues.
+
+```admonish info "Conclusion"
+
+
+
+Players simply trying to get ghost roles is not an admin issue, not addressed by the rules, and should be solved by code. Where larger issues arise is where players take up slots in multiple servers for prolonged periods of time day after day this is still not directly addressed by the rules. In those cases we can stop those players through role 0 if it's dire enough and even still at most the player should be warned. A simpler way to deal with this issue would be to just require players not play on multiple wizden servers at the same time.
+
+```
+
+### Async Trialmin Promotions
+
+- Asynchronous votes/promotions could only be made in exceptional circumstances. For example(This list is not authoritative. In any case this should be decided on a case by case basis.):
+ - Severe misconduct which will likely lead to the trialmin's removal following a vote.
+ - Retired admins coming out of retirement who already have knowledge and experience of how to be an admin. Even still, after enough time retired admins will likely still require a full trialmin phase. Such votes should be heavily scrutinized.
+ - Trialmins taking extended holidays having their votes delayed compared to others.
+- Asynchronous promotions can cause a lot of friction for trialmins that were not promoted. In order to avoid this the promotion of other trialmins should be held back until that trialmin is either promoted, or removed.
+- Trialmins may also have no problem with asynchronous votes, in which case it would be fine to promote certain trialmins faster than others.
+
+
+```admonish info "Conclusion"
+
+
+
+We could either require all trialmin promotions be synchronous except for special circumstances, or go forward with async promotions all the time. No conclusion was reached other than just discussing the pros and cons of these options. Further discussion is required.
+
+```
+
+### Character Impersonation
+
+- We commonly get problems with players impersonating other well known player characters or even characters of staff members.
+- Players sometimes end up with the same character names by chance, usually this is fine because their character will also look differently.
+- Players who intentionally try to impersonate others can cause major issues for the ones they impersonate. Regardless of our rules on meta-grudging, players will inherently treat a character differently depending on who they know them as.
+- This currently can fall under the "Don't be a dick", or "Notable characters" rule however this would be better addressed by amending our naming rules.
+- There is also the posibility of players trying to imitate another's username. In these cases we can simply use the "Don't be a dick" rules.
+- Enforcement of these kinds of rules starts and ends on our servers only.
+- [details of real example provided by CE] Currently the details are still unclear, but it looks like this is not for us to enforce.
+
+```admonish info "Conclusion"
+
+
+While 2 characters randomly having the same name is usually fine, players intentionally impersonating others can cause major issues. In such cases we should enforce against this using the "Don't be a dick", or "Notable characters" rule for now where these players are acting maliciously and consider amending our naming rules. Should a player try to immitate another's username to harass them we can similarly take action against that. Additionally in most cases handling these issues for chracters between servers are usually outside of our purview.
+
+```
+
+
+### Early access blocks from admins
+
+- Mass actions. This includes bans, freezes, and similar admin actions that we can use against coordinated rule breakers. Covered by [this issue](https://github.com/space-wizards/space-station-14/issues/13270).
+- Toolshed is not finished, and not sufficiently documented. Most admins are unable to use it effectively, and the those that can have only limited uses for it.
+
+### Reduction votes without reduction times
+
+- Topic tabled due to lack of time.
+
+### Discussion outside Agenda Items
+- Trialmin review procedure needs improvement. Currently reviews are often delayed and as a result hold back trialmins.
+
+## Overall Conclusion
+- Ghost role antag rolling only really presents a problem when players hog slots in multiple servers at the same time for prolonged periods. In aggregious cases we can warn players not to do it under rule zero after approval. We can also simply require that players don't connect to multiple servers at the same time but this ideally is a coder issue.
+- No overall conclusion on async promotions of trialmins was reached and requires furhter discussion.
+- Character impersonations become a problem when a player maliciously and intentionally impersonates another. We can use for the "Don't be a dick", or "Notable characters" rule in those case and should consider amending our naming rules to better protect against this.
+- The only new admin blocker that was brought up is toolshed.
diff --git a/src/en/admin-meetings/admin-meeting-2024-03-30.md b/src/en/admin-meetings/admin-meeting-2024-03-30.md
new file mode 100644
index 000000000..04914bb2a
--- /dev/null
+++ b/src/en/admin-meetings/admin-meeting-2024-03-30.md
@@ -0,0 +1,183 @@
+# Admin Meeting 2024-03-30
+
+## Agenda
+
+
+- Brief updates from last meeting
+- Reduction votes without reduction times
+- Trialmin improvements
+- When do players playing as antags cause rule issues?
+- Review minutes
+
+## Topic Details
+
+
+### Brief updates from last meeting
+
+The last meeting's minutes are available at [link]
+
+#### Summary
+> Headmin magic has caused async trial promotions to happen. I didn't have time to write out this summary early so I'm not sure what other things should be included here.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+1. Communicate updates related to items from the last meeting to admins attending the meeting.
+
+### Reduction votes without reduction times
+
+#### Summary
+
+> Can we put what time you want if you vote for reduction, Currently if not one mentions a time it defaults to 1 week. But if someone votes for something like 2 months and there are another 6 admins that did not define something that is a huge difference in reduction. Adding a time would be useful here.
+> Another thing to keep in mind is the ban time. Reductions are a reduction from a indef ban to a set time, not altering the start date of said ban. If they have already been banned for 2 weeks and we reduce to 1 week it was the same as if we had just removed.
+> -Repo
+
+> I think if people don't care enough to write out what they want the reduction to, then there's no issue with however many do care enough from determining the reduction time on their own.
+>
+> For reductions, I don't think it makes sense to reduce from the start of the ban because it makes two of the vote options actually mean the same thing sometimes instead of actually being different options. I think every time I've been asked, I've told people to reduce from the time that the vote was put up.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+1. Determine if admins should be required to specify a reduction time if voting to reduce a ban.
+2. Determine if the time since the ban was placed is something admins are suggested to add to appeal votes.
+
+### Trialmin improvements
+
+#### Summary
+
+
+> Is there anything we can do that will improve how the next batch goes?
+>
+> Ideally specific actions that we know can be accomplished. Everyone knows it'd be better if mentors were able to get reviews in on time but no one is intentionally not doing them on time so we'd need ideas for how to make it more likely if that's something we wanted to focus on.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Determine a list of specific actions that can be taken to improve how the next batch of trialmins goes, including things related to selection.
+2. Optionally, determine any issues which may be plausible to be addressed before or considered during the next trial batch.
+
+### When do players playing as antags cause rule issues?
+
+#### Summary
+
+
+> There was a thread for this at [link removed] and there is a doc at [link removed]. The goal of this topic is to just ensure that the contents of the document are complete and accurate so that it can be forwarded to maintainers.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Ensure that the contents of the document are complete and accurate so that it can be forwarded to maintainers.
+
+### Review minutes
+
+#### Summary
+
+> The meeting minutes provide a record of the meeting for those who could not attend, and they are used to action decisions made in the meeting. For these reasons, it is important that they accurately represent what actually happened in the meeting.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+1. Ensure that nothing important is missing or misrepresented in the minutes.
+2. Attempt to ensure that all topics have met their meeting goals. This can be done by ensuring that each meeting goal is directly addressed by the conclusion of the topic's minutes.
+3. Attempt to ensure that all conclusions fit into one of the following categories:
+ 1. Indicate that a meeting goal was completed.
+ 2. Are something actionable, meaning that they not only call for an action, but that action is specific enough that it does not require answering questions like "what exactly needs to be done?" or "how can this be done?"
+ 3. Clearly indicate that the meeting goals for the topic were not met. Examples: the discussion was tabled, the admin team did not reach a conclusion, the admin team was not able to make the conclusion actionable.
+
+```admonish info
+
+## Attendees
+
+- Chief_Engineer - Headmin
+- Skarlet - Headmin, Mediator
+- liltenhead - Headmin
+- ShadowCommander - Project Manager
+- nikthechampiongr - Propermin, Minutes Editor
+- Ryan_strudtfelt - Propermin
+- AjexRose - Propermin
+- TurboTracker - Propermin
+- Sphiral - Propermin
+- Kezu - Propermin
+- Repo - Propermin
+- Geekyhobbo - Propermin
+- eric156 - Propermin
+- CptJeanLuc - Propermin
+- Lucky - Propermin
+- Crazybrain - Propermin
+- Pancake - Propermin
+- Jarmer - Propermin
+- lunarcomets - Propermin
+- Violet - Trialmin
+
+```
+
+## Minutes
+
+### Brief updates from last meeting
+
+- Headmin decision has led to asynchronous trialmin promotions being adopted.
+
+
+
+### Reduction votes without reduction times
+
+- Admins will be required to provide a reduction time with their reduction vote and be able to justify it.
+ - This could be expanded to require admins justify their votes in general, not just reduce.
+ - Since many times the reason may have already been stated by another admin, it will be possible to simply react/reply to a reason and time you agree with.
+- Reduction times will be applied from the time a vote was made.
+ - Reductions from the time the vote was placed may sometime "add" onto a ban should admins vote for how much time the ban is worth, but this should solveably by just making this standard clear.
+ - Reductions from the time the ban was made may cause confusion, and will often lead to the options for reduce/accept to mean the same thing if the proposed reduction time is shorter than the time the appeallant has been banned for.
+- On deciding which reduction to apply, an average or a mean can be used for different admin suggestions.
+- Alternatively, we could require consensus in the appeal thread and call upon headmins to break a stalemate or have a vote.
+- Appeals will display the recommended ban duration as set out by the admin policy.
+- SS14.Admin issues can be made to add QOL features to ban appeal votes, like copying relative time of the ban in discord format
+
+```admonish info "Conclusion"
+
+#### Conclusion
+
+Consensus was reached to require admins to justify their reduction votes and provide a reduction time, applying reductions from the time the vote was started, and presenting the recommended ban time on appeal votes. More discussion is needed to decide how to resolve disputes on what the reduction time should be.
+
+```
+
+
+
+
+### Trialmin improvements
+
+- A clear schedule must be made for Mentors to provide reviews.
+- It should be clearer for regular admins how they can pass along feedback, and how to interract with trialmins.
+- The propermin wide thread for trialmin reviews will be brought back to allow for feedback to be more easily given from propermins to mentors to trialmins.
+ - Admins derailing that thread will be 1984'd. We will also have a slowmode to ensure this.
+- Trialmins will be prohibited from taking part in events in general until the last part of the trial where they are proficient with the admin tools and aware of what's appropriate.
+ - This will likely just be the last 2 weeks of their trial as decided by the Mentors.
+- A gantt chart - jeanluc - CE
+- Relax requirements on when reviews will be put out. If there has not been sufficient activity to make a review then one will not be made.
+- Make it clear to new trialmins that a trial will on average last 2 months. This will be done on the application. They should not feel pressured to make excessives notes/bans, or spend long periods of time in game "to get good reviews".
+- Trialmins should know that they are able to reach out to any and all admins at any time for assistance.
+
+```admonish info "Conclusion"
+
+#### Conclusion
+
+Consensus was reached to bring back the propermin wide thread for trialmin reviews, the mentor specific channel and threads will remain. Additionally trialmins will now be prohibited from taking part in events until the last weeks of their trial where they will be able to do them under supervision. Reviews will be put out when mentors believe it is appropriate, otherwise that week will be skipped. Trialmins need to be made aware that a trial is a long term commitment and that they shouldn't be expending extreme amount of time in adminning and should take proper breaks. They should also not be scared to reach out to the entire admin team for any question they may have.
+
+```
+
+### When do players playing as antags cause rule issues?
+
+- The contents of the doc were discussed, and expanded upon.
+
+
+### Discussion outside Agenda Items
+
+
+- Murderboning is currently in a very large gray area and requires clarification. Will be brought up in a future meeting.
+
+## Overall Conclusion
+
+
+Reduce votes will now require justification and a provided time from admins with the reduction being applied from the time the vote started. Trialmins will now only be allowed to take part in events, and host them with supervision near the end of their trial. The propermin thread for trialmins will be brought back with a slowmode to prevent derailing. Trialmins still need to be made more aware of what's expected of them so they stop living inside the computer to admin. They should also know that they should reach out to the entire admin team for assistance. The review process will be improved to be less stringent on requiring a review every week, and to make guidelines clearer.
diff --git a/src/en/admin-meetings/admin-meeting-2024-04-27.md b/src/en/admin-meetings/admin-meeting-2024-04-27.md
new file mode 100644
index 000000000..cf3df431f
--- /dev/null
+++ b/src/en/admin-meetings/admin-meeting-2024-04-27.md
@@ -0,0 +1,261 @@
+# Admin Meeting 2024-04-27
+
+## Agenda
+
+
+- Brief updates from last meeting
+- Murderbone
+- Salamander RP
+- Metashield
+- Mandated celebration of the coming of Discourse
+- Discourse
+- Another mandated celebration of the coming of Discourse
+- Review minutes
+
+## Topic Details
+
+
+### Brief updates from last meeting
+
+The last meeting's minutes are available at [link removed]
+
+#### Summary
+
+> - Trialmin event restrictions changed for this batch. I'm not sure how that's gone because I haven't really been involved in this trial batch.
+> - We have gantt charts for trialmins that we're using to keep a schedule for their trials, including deliverables (incredible)
+> - There is a propermin wide trialmin feedback/reporting/thingy thread that has somehow managed to not derail yet I think
+> - I updated the admin application with information on expectations, specifically around time commitment
+> - Murderbone is a topic on this agenda
+> -Chief_Engineer
+
+#### Meeting Goals
+1. Communicate updates related to items from the last meeting to admins attending the meeting.
+
+### Murderbone
+
+#### Summary
+
+
+From the last meeting:
+> Murderboning is currently in a very large gray area and requires clarification. Will be brought up in a future meeting.
+>
+> Basically we need to get at least a rough idea of what is murderbone so that we can put it in the rules when the great rewrite finishes in 7 years. Some important things are that it be clear with minimal gray areas, that it's quick to communicate so that it doesn't add an entire page of rules, and that it be somewhat robust against changes to the games so that we don't have to rewrite it every 2 weeks when something new is added.
+>
+> For some background, murderbone used to be essentially any voluntary and unnecessary round removal of another player. Gibbing people who weren't targets of you for no real reason would have been murderboney. Around a year ago we loosened the definition to basically be mass killing in a way that "isn't interesting". That is omega subjective so literally all I've ever been able to do when people ask is give the example that was given when it was proposed, camping a maint grille is murderbone, running through the halls with an L6 is not.
+>
+> This sort of ties in with mass station sabotage as it seeks to accomplish the same goal, ensure that antags aren't essentially robbing non-antags of gameplay by treating the game like a deathmatch in situations where it is not meant to be a deathmatch. Some important questions are:
+> - How much do we want to enforce this with rules rather than just letting maintainers deal with it?
+> - If we are dealing with it with rules, how much of what we're doing is just compensating for development issues, and should we be compensating that much?
+>
+> I think intrinsically it's going to be easier to communicate this the more extreme we go to either side. Kill anyone if you're an antag and only try to accomplish your objectives are both fairly clear rules, things in the middle generally are not.
+>
+> When we changed this a year ago, I suggested that we do so by just giving all antags a temporary objective to allow them to murderbone, something like "complete your objectives at any cost", "(Optional) die a glorious death" or something, but that's not the option we went with. We're already pretty close to there being no rule, but I generally would still recommend that if loosening rules experimentally, it be done in a way that minimizes the loosening done through the actual text of the rules since it is a lot harder to get everyone on the same page if you need to tighten rules again.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Determine the opinions of attending admins about when killing transforms into murderbone.
+2. Determine how to clearly and effectively communicate that to players and other admins.
+
+### Salamander RP
+
+#### Summary
+
+> I have heard from several salamander players that the rp standard on salamander has fallen drastically. They specifically point to metagaming of antags, and EORG as significant issues. We should establish if there is a larger issue and find out how to deal with it. -nikthechampiongr
+
+
+#### Meeting Goals
+
+
+1. Establish whether the rp level on salamander has fallen by a signficant degree and why.
+2. Examine ways to relieve the issue if it exists.
+
+
+### Metashield
+
+#### Summary
+
+
+> Basically we need to get at least a rough idea of what is metagaming so that we can put it in the rules when the great rewrite finishes in 7 years. Some important things are that it be clear with minimal gray areas, that it's quick to communicate so that it doesn't add an entire page of rules, and that it be somewhat robust against changes to the games so that we don't have to rewrite it every 2 weeks when something new is added.
+>
+> imo a decent way to do this is to have a table that lists in one column what is metashielded, in another what causes the metashield to lift, and in another extra info or something like exemptions on who it applies to. Examples can be very effective for communicating rules, but can also take up a lot of space, if there's a way to format things to include collapsed examples for each item, I think we should do that.
+>
+> Also I have this draft https://wiki.spacestation14.io/wiki/User:Chief_Engineer/Metashield
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Determine the opinions of attending admins about what should be metashielded.
+2. Determine how to clearly and effectively communicate that to players and other admins.
+
+### Mandated celebration of the coming of Discourse
+
+#### Summary
+
+
+> Discourse is here, celebrate. Celebration is required.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Ensure that all present have celebrated the coming of Discourse
+
+### Discourse
+
+#### Summary
+
+
+> Discourse is here. Has anyone noticed any issues, or have any concerns right now?
+>
+> What about suggestions?
+>
+> Related thread [Discourse Organization Workshop](https://discord.com/channels/310555209753690112/1233561013945761836)
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Compile a list of issues that game admin noticed with Discourse
+2. Compile a list of concerns that game admins have with Discourse
+3. Compile a list of actionable suggestions that game admins have for improving Discourse
+
+### Another mandated celebration of the coming of Discourse
+
+#### Summary
+
+
+> Discourse is here, celebrate again. Celebration is still required.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Ensure that all present have celebrated the coming of Discourse
+
+### Review minutes
+
+#### Summary
+
+> The meeting minutes provide a record of the meeting for those who could not attend, and they are used to action decisions made in the meeting. For these reasons, it is important that they accurately represent what actually happened in the meeting.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+1. Ensure that nothing important is missing or misrepresented in the minutes.
+2. Attempt to ensure that all topics have met their meeting goals. This can be done by ensuring that each meeting goal is directly addressed by the conclusion of the topic's minutes.
+3. Attempt to ensure that all conclusions fit into one of the following categories:
+ 1. Indicate that a meeting goal was completed.
+ 2. Are something actionable, meaning that they not only call for an action, but that action is specific enough that it does not require answering questions like "what exactly needs to be done?" or "how can this be done?"
+ 3. Clearly indicate that the meeting goals for the topic were not met. Examples: the discussion was tabled, the admin team did not reach a conclusion, the admin team was not able to make the conclusion actionable.
+
+
+```admonish info
+## Attendees
+
+- Chief_Engineer - Headmin
+- Skarlet - Headmin, Mediator
+- Nairod - Headmin
+- metalgearsloth - Project Manager
+- ShadowCommander - Project Manager
+- nikthechampiongr - Propermin, Minutes Editor
+- Crazybrain - Propermin
+- ryan_strudfelt - Propermin
+- Kezu - Propermin
+- Sphiral - Propermin
+- TurboTracker - Propermin
+- WithinElysium - Propermin
+- CptJeanLuc - Propermin
+- ChudGunderson - Propermin
+- Luckyshotpictures - Propermin
+- lunarcomets
+- mirino - Trialmin
+- Aexxie - Trialmin
+```
+
+## Minutes
+
+### Updates from last meeting
+
+
+- Trialmin event restrictions changed. They cannot participate in events. They can host events with supervision near the end of their trial.
+- We got the global trialmin thread and ~~through the power of discourse~~ it has not derailed.
+
+### Defining Murderboning
+
+- Currently murderboning is an extremely large grey area that needs to be properly defined.
+- We could define it as "a traitor going out of their way to murder other players without a reason." This would include killing players which could plausible pose a threat but otherwise are not actively threatening the antagonist, and don't contribute to them completing their objectives.
+- Alternatively we can define the reasons that justify a traitor killing other players:
+ - Killing the player has a strong connection to their objective,
+ - They pose a threat to the traitor at the moment,
+ - or they could plausible be a threat in the future.
+- Additionally we can require that murderboning be a traitor taking a player out of the round permanently rather than simply killing them as medical can often just revive them in a short time. This would allow traitors to be able to murder an incredible amount of people but simply not making them unrevivable.
+- This could simply be moved to admin discretion since it's unbelievably hard to set out a proper definition and most cases can only be resolved on a case-by-case basis.
+- IDEAGUYS: We could just have gameplay consequences, for example having players be automatically be put out as wanted if they reach a certain killcount.
+- This will be put to a thread for further discussion.
+- All of this will be put to a vote in the future.
+
+```admonish info "Conclusion"
+
+#### Conclusion
+
+
+
+Possible changes to the rule will be put up to a vote. The definitions discussed range from just making this fall under admin consensus, or in other ways try to make a set of criterea for what murder boning is that admins can follow. These however cannot reflect all possible situations.
+
+```
+
+### Salamander RP status
+
+- Consensus is that there has been a degredation of RP status on salamander with a lot of cases where players have "LRP+" behavior. E.g. validhunting terminators.
+- We need to brush up on mrp rules and have much stricter enforcement of them.
+- Dewhitelists should be handed out more freely to problematic players.
+ - Dewhitelists can have the following standard: Should a player commit a violation of rp rules, then the handling admin may at their descrition apply dewhitelistment as a punishment.
+- IDEAGUYS: Implement a way for players to properly try to suspect implants, and have a way for them to act on it without having to metagame.
+- We currently do not have a proper definition of MRP. We only have a vague idea.
+ - A proposed definition: Players act according to their role. They are not all knowing and attempt to cooperate with each other in order to accomplish tasks and try to act like this is a real workplace. This is also facilitated through stuff like space law. Even so, players are allowed to deviate from following these standards allowing them to be silly and bending what they are capable of.
+
+```admonish info "Conclusion"
+
+#### Conclusion
+
+There is currently a problem with the rp status on salamander. For now we will start enforcing rp rules strictly. Additionally we will loosen up requirements for dewhitelists to be used as punishments. The mrp status of salamander is very complex, and this will require more work. We will even need to decide what exactly we want "mrp" to be.
+
+```
+
+### Metashield
+
+- We'll be adopting the [Metashield list](https://wiki.spacestation14.io/wiki/User:Chief_Engineer/Metashield) which will be a list containing all the reasonable ways for specific antags, and items to be revealed. This list will be kept up to date routinely as the game gets updated.
+- Ideally this stuff should be dealt with mechanically, however this is monumental task for contributors and maintainers and currently we are nowhere near that point.
+- We'll be sending this to thread hell for further refinement.
+
+### DISCOURSE!!!!
+- DISCOURSE
+- **DISCOURSE**
+- **__DISCOURSE__**!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+### Problems with discourse
+
+- Surprisingly nobody has had any issues after having barely used discourse.
+- ~~Clearly this means that discourse is perfect~~
+- This topic will be brought up again in the next meeting.
+- Admins should report issues with discourse on [this thread](https://discord.com/channels/310555209753690112/1233561013945761836)
+
+
+### DISCOURSE THE SECOND
+- LETS GOOO DISCOURSESWjsGDAIJG
+- INVISION IS DEAD REST IN PISS
+
+### Discussion outside Agenda Items
+
+- There is a general problem with RP standards on all servers, not just mrp.
+- We could have a deathmatch server to suck away the people that just want to fight.
+
+## Overall Conclusion
+
+Murderboning was discussed. Due to its nature it's extremely hard to define and has been sent for further discussion.
+Salamander's mrp status was discussed and consensus is that it has declined. For now we will be stricter with enforcing mrp rules, and use dewhitelists more often to remove problematic players.
+The metashield list will be adopted.
+Discourse is real. Invision is dead.
diff --git a/src/en/admin-meetings/admin-meeting-2024-05-18.md b/src/en/admin-meetings/admin-meeting-2024-05-18.md
new file mode 100644
index 000000000..0ff47b823
--- /dev/null
+++ b/src/en/admin-meetings/admin-meeting-2024-05-18.md
@@ -0,0 +1,266 @@
+# Admin Meeting 2024-05-18
+
+## Agenda
+
+
+- Brief updates from last meeting
+- Discourse
+- Trialmin Discoursification
+- Trialmin Onboarding
+- Silicon Policy
+- Disclosed Ban Evasion and Alts
+- Review minutes
+
+## Topic Details
+
+
+
+### Brief updates from last meeting
+
+The last meeting's minutes are available at [link]
+
+#### Summary
+
+> - There's currently an internal discussion thread about the salamander whitelist
+> - I've been working on the rule rewrite, including metashield draft
+> - Discourse still real
+> -Chief_Engineer
+
+#### Meeting Goals
+
+1. Communicate updates related to items from the last meeting to admins attending the meeting.
+
+### Discourse
+
+#### Summary
+
+
+> Discourse is here. Has anyone noticed any issues, or have any concerns right now?
+>
+> What about suggestions?
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Compile a list of issues that game admin noticed with Discourse
+2. Compile a list of concerns that game admins have with Discourse
+3. Compile a list of actionable suggestions that game admins have for improving Discourse
+
+### Trialmin Discoursification
+
+#### Summary
+
+
+> Can any trialmin processes be moved to Discourse? How should that move happen?
+>
+> The main limitations to keep in mind are:
+> - Discourse does not allow user level permissions on categories, only user group level
+> - People probably do not monitor Discourse as closely as they do Discord
+> - Discord relays can only filter by category and tag. Topic creation or all posts can be relayed to a channel. You cannot relay to a Discord thread or to a specific location per Discourse topic.
+>
+> Main goals are:
+> - Trialmins should not be able to see their internal threads even after becoming propermins
+> - There should be a clear place to go to say "there is a widespread issue with most/all current trialmins"
+> - There should be a clear place to go to s ay "there is an issue with this specific trialmin". This can be the same place as for multi trialmin issues, but a specific place per trialmin may be more ideal
+> - Mentors must be able to see at least the threads for their own trialmins
+>
+> Here's an idea I had:
+> A category is created that can only be seen by either propermins or trialmin mentors, I'm not sure which option is better. A "vault" subcategory is created that can only be seen by head admins. Internal threads for trialmins are created in the category, and then moved to the vault when the trialmin ends their trial. Discord thread is retained and is used either for widespread issues or as the team wide thread if propermins don't have access to the trialmin discourse topics. Having the subcategory be mentors only might be preferred. If two trialmins were involved in a situation, the incident might be described in both trialmins' threads. Having a mentor category instead of a propermin category would allow us to keep both from seeing the information by preventing either from being a mentor until both finish their trials rather than requiring us to do a synchronous promotion.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+1. Collect any potential issues or concerns related to moving trialmin stuff to the forums
+2. Identify possible ways to improve the trialmin process by moving parts to discourse
+
+### Trialmin Onboarding
+
+#### Summary
+
+
+> Is there anything that's currently outdated or could be improved with trialmin onboarding?
+> -Chief_Engineer
+
+#### Meeting Goals
+
+1. Identify any specific issues with the trialmin onboarding process
+
+### Silicon Policy
+
+#### Summary
+
+
+> Borgs and their laws are flawed. They're meant to be that way but we all know they've been a bit of a headache to deal with both for admins and players. They should be flawed, but not in such a way that loopholes can be used to break server rules and/or ruin someone's round because technically they can.
+> -Kezu
+
+#### Meeting Goals
+
+Compile admin team opinions on the following questions:
+1. What should be the restrictions/limitations of borgs?
+2. What loopholes should be closed?
+
+### Disclosed Ban Evasion and Alts
+
+#### Summary
+
+
+> [link]
+>
+> Want to reaffirm our position surrounding ban evasion using this forum post as an example
+>
+> 1) A user simply stating they have/have had used an alt account does not discredit their attempt to ban evade.
+> - The above mentioned ban appeal was made after a ban evasion attempt was made, likely admitting to the alt in hopes that it would not result in a voucher upgrade.
+>
+> 2) A user that elects to admit they have an alt should have the alt banned immediately via GUID due to it being against our rules
+> - This point specifcly is shakey as technically in our rules, even having an alt account is grounds for immediate appeal only bans on all of them.
+> -TurboTracker
+
+> I agree with the idea that disclosing an alt or ban evasion does not exonerate a player, but I don't think the reason for disclosure can or should be read into too much. The appeal wizard currently asks players to list their alternate accounts. If we are drawing a negative inference from a player truthfully answering that question, we wouldn't be able to also draw a negative inference from them lying by listing no alts, even though it seems to make more sense to draw the negative inference when they lie rather than when they are honest.
+>
+> Multikey disclosed via appeals I think needs to be handled case by case. Alternate accounts should always be account banned, but if, for example, they never connected to WizDen, or only ever connected once years ago, then there's probably no need to treat that like multikey.
+>
+> [WITHHELD]
+> -Chief_Engineer
+
+#### Meeting Goals
+
+
+Collect admin opinions on the following questions to act as guidelines until the completion of the policy rewrite, and that can be considered while rewriting policies and guidelines:
+1. How should a player disclosing an alternate account used in ban evasion, or the ban evasion attempt itself, affect the player's appeal? Should failure to disclose have any effect?
+2. How should multikey be handled when it is disclosed through an appeal? Does it matter if the ban is temporary or indefinite?
+
+### Review minutes
+
+#### Summary
+
+> The meeting minutes provide a record of the meeting for those who could not attend, and they are used to action decisions made in the meeting. For these reasons, it is important that they accurately represent what actually happened in the meeting.
+> -Chief_Engineer
+
+#### Meeting Goals
+
+1. Ensure that nothing important is missing or misrepresented in the minutes.
+2. Attempt to ensure that all topics have met their meeting goals. This can be done by ensuring that each meeting goal is directly addressed by the conclusion of the topic's minutes.
+3. Attempt to ensure that all conclusions fit into one of the following categories:
+ 1. Indicate that a meeting goal was completed.
+ 2. Are something actionable, meaning that they not only call for an action, but that action is specific enough that it does not require answering questions like "what exactly needs to be done?" or "how can this be done?"
+ 3. Clearly indicate that the meeting goals for the topic were not met. Examples: the discussion was tabled, the admin team did not reach a conclusion, the admin team was not able to make the conclusion actionable.
+
+```admonish info
+
+## Attendees
+
+
+- Skarlet - Headmin, Mediator
+- nikthechampiongr - Propermin, Minutes Editor
+- Crazybrain - Propermin
+- Geekyhobo - Propermin
+- Kezu - Propermin
+- ajexrose - Propermin
+- Violet - Propermin
+- Kayek - Propermin
+- Sphiral - Propermin
+- TurboTracker - Propermin
+- Repo - Propermin
+- TheChudster - Propermin
+- ryan_strudfelt - Propermin
+- CptJeanLuc - Propermin
+- Stealth16 - Propermin
+- Lunacomets - Propermin
+- Sammy - Trialmin
+- GalaxyCad - Trialmin
+```
+
+## Minutes
+
+### Brief Update
+
+- Editor's note: From these minutes onward I will not actually be writing anything in this section unless something additional is said and is relevant. The topic description alreay has everything.
+
+
+### Discourse
+
+- It seems attached videos do not work.
+- Onboarding admins on discourse has been troublesome with admins often getting confused with some obscure features.
+- TODO dates are not formatted the same as hedgedoc.
+- ~~There is literally nothing else wrong with discourse~~ Any further issues have been discussed in [this thread](https://discord.com/channels/310555209753690112/1233561013945761836)
+
+```admonish info "Conclusion"
+
+
+
+Issues brought up will be looked at by CE. Further issues should be redirected to [this thread](https://discord.com/channels/310555209753690112/1233561013945761836).
+
+```
+
+### Trialmin Discoursification
+
+- With CE's proposal, all mentors will be able to view all the trialmin threads since we cannot set individual user permissions.
+ - We could technically abuse user groups to emulate individual permissions, however this would be hell to manage.
+ - We generally wish to keep trialmin discussions by mentors sealed after that trial period is over. This is mainly because of how both mentors, and newly promoted propermins alike react to old statements.
+- Admins are still not used to discourse, although putting the trialmin process on discourse will allow new trialmins to quickly learn and use discourse more effectively.
+
+```admonish info "Conclusion"
+
+
+
+
+We will not be moving all of the trialmin process to discourse at this time. We will however utilize discourse's features to make onboarding smoother which we couldn't do with just discord and invision.
+
+```
+
+### Trialmin Onboarding
+
+- We can utilize discourse features to make onboarding smoother for trialmins. For example:
+ - By making our onboarding docs more interactive. For example we can allow for trialmins to mark their progress.
+ - Allow for trialmins to ask questions easier without having to post it in admin general for every admin to see, or to have to specifically approach a mentor in dms.
+- Docs are outdated for policy regarding trialmins processing appeals and events.
+- Onboarding docs generally could do with a small rewrite.
+
+```admonish info "Conclusion"
+
+
+
+Trialmin onboarding docs will be cleaned up and discourse will have a greater role in onboarding.
+
+```
+
+
+### Silicon Policy
+
+- Both players and admins sometimes seem to think that borg laws and the rules around them override other rules such as "Don't be a dick", or our escalation rules. We should clarify that borgs are still fully bound by the rules, unless it's explicitly stated that they are not by the rules. A clarification will be published on this topic.
+- We could also request that the laws be changed but it's likely any changes would also be rules-lawyered, or be too restrictive.
+
+```admonish info "Conclusion"
+
+
+
+Currently the most prevalent issue is borg players assuming their laws override station rules. This topic will be further discussed in a discourse topic.
+
+```
+
+### Disclosed Ban Evasion and Alts
+
+- [WITHHELD]
+- When an alt is disclosed, regardless of any other circumstances that alt should be gamebanned so that it cannot be used. This should not be applied to the main account.
+ - We need a response template for this.
+- We should not draw adverse inferences against appellants for propery disclosing alt accounts.
+ - This means we should not immediately apply a voucher ban for alting if they disclose they have another account without proof of evasion.
+
+```admonish info "Conclusion"
+
+
+We will define that disclosed alt accounts will immediately be banned without affecting the main account. Disclosure is not grounds for an immediately voucher ban. [WITHHELD]
+```
+
+### Discussion outside Agenda Items
+
+- All topics except for ones that are literally 1 point long or empty will have a conclusion instead of being at the discretion of the editor. Editor's note: :despair: (This used to be an image in the original minutes however I cannot do it on mdbook without adding it to the repo which I don't wish to do.)
+
+## Overall Conclusion
+
+
+We will be utilizing discourse more for trialmin onboarding, however discussion and reviews for trialmins will be kept in discord. Borg rules will be clarified so that borgs cannot claim that their laws allow them to violate other rules. We now have a clear policy with how to deal with disclosed ban accounts: The account will be banned without any further action on the main account.
+
+🦀
diff --git a/src/en/assets/images/jokerroles/lil_room.png b/src/en/assets/images/jokerroles/lil_room.png
new file mode 100644
index 000000000..346bd2f77
Binary files /dev/null and b/src/en/assets/images/jokerroles/lil_room.png differ
diff --git a/src/en/community/admin/admin-tooling.md b/src/en/community/admin/admin-tooling.md
index 53ad3817f..99821ad6a 100644
--- a/src/en/community/admin/admin-tooling.md
+++ b/src/en/community/admin/admin-tooling.md
@@ -184,7 +184,7 @@ Use the `list` command to list all available commands, and the `help
Otherwise, extend voucher ban to 6 months from evasion attempt. | | |
+| Language | Non-english chat | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB |
+| Language | Solely non-english chat | W | Indef GB | | |
+| Exploits | Bugs/exploits | **W** - 7d GB | 12hr - 7d GB | 3d - 15d GB | 7d - 15d GB |
+| Exploits | Use of macros | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB |
+| Non-grouping | Multi-keying | W - **Indef** GB | Indef GB | | |
+| Non-grouping | Ahelp misuse in bad faith[^badFaith] | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | |
+| Non-grouping | Threats to ahelp | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | |
+| Non-grouping | Under 16 | Indef GB | | | |
+| Non-grouping | Bad character name[^requiresIntent] | **W** - 12hr GB | **12hr** - 3d GB | **7d** - 7.5d GB | |
+| Metagaming | IC in OOC[^positiveException] | W | W - 12hr GB | 3d GB | **7d** - 7.5d GB |
+| AI Laws | Major failure to follow silicon laws | W - 5d RB | 3d - 7.5d RB | Indef RB | |
+| AI Laws | Minor failure to follow silicon laws | W | W - 5d RB | 3d - 7.5d RB | Indef RB |
+| Familiars | Familiar griefing master | 12hr GB | 3d GB | **7d** - 7.5d GB | |
+| Familiars | Familiar unreasonable failure to obey orders | W | 12hr GB | 3d GB | **7d** - 7.5d GB |
+| Immersion | Text speak | W | W | **W** - 12hr GB | W - 12hr GB |
+| Immersion | OOC terms IC[^teachingException] | W | **W** - 12hr GB | **12hr** - 3d GB | 3d - 7.5d GB |
+| Immersion | Bypassing chat restrictions | W | W - **4hr** - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB |
+| Metagaming | Using info from death[^infoFromDeath] | W - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | |
+| Metagaming | Using info from past life | 12hr - 48hr GB | 3d GB | **7d** - 7.5d GB | |
+| Metagaming | Metagaming round type | W - 12hr GB | 12hr - 3d GB | 3d - 7.5d GB | |
+| Griefing | Damage/disruption to arrivals/arrivals shuttle | 12hr - 3d GB | 3d - 7d GB | 7d - 15d GB | |
+| Self-antag | Self-antag[^excludingEscalationIssues] | W - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | |
+| Self-antag | Station sabotage[^stationSabotage] | W - 3d GB | 12hr - 7d GB | 14d - 15d GB | |
+| Self-antag | Cults/riots/revolutions | **12hr** - 3d GB | 12hr - **3d** - 7d GB | **7d** - 7.5d GB | |
+| Self-antag | Cooperating with known antags | 12hr GB | 3d GB | **7d** - 7.5d GB | |
+| Griefing | Round stalling | **W** - 12hr GB | **12hr** - 3d GB | 3d - 7d GB | **7d** - 7.5d GB |
+| Griefing | Friendly antag[^antagOnly] | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | |
+| Griefing | Antagonist team sabotage[^antagOnly] | 12hr - 3d GB | 3d - Indef GB | 7d - Indef GB | |
+| Griefing | Early massive station sabotage[^antagOnly] | **W** - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | |
+| Griefing | Unreasonable failure to follow an order from a team leader | W - 5d RB | 3d - 7d RB | Indef RB | |
+| Griefing | Harassing a player/role/department with no IC conflict | W - 12hr GB | 12hr - 3d GB | **7d** - 7.5d GB | |
+| Escalation | Over escalation[^eachVictim] | W | 12hr GB | 3d GB | **7d** - 7.5d GB |
+| Escalation | RDM[^eachVictim] | 12hr GB | 3d GB | **7d** - 7.5d GB | |
+| Escalation | Over escalation or RDM that is a secondary result of station sabotage[^stationSabotageRDM] | 12hr GB | 3d GB | **7d** - 7.5d GB | |
+| Griefing | Abandoning a role[^abandoningRole] | W - 5d RB | 3d - 7d RB | Indef RB | |
+| Griefing | Antag rolling | 12hr - 3d GB | 3d - 7d GB | **7d** - 7.5d GB | |
+| Competence | Unreasonable incompetence in role | W - **3d** - 7d RB | 7d - 15d RB | Indef RB | |
+| Competence | Abuse of a position of authority | 3d - 7d RB | 7d - 15d RB | Indef RB | |
+| Competence | Taking actions a reasonable person would view as to be to the detriment of the station as security/command | 3d - 7d RB | 7d - 15d RB | Indef RB | |
+| Competence | Unreasonable failure of security/command to follow space law | W - **3d** - 7d RB | 7d - 15d RB | Indef RB | |
[^eachVictim]: Guideline is multiplied by the number of victims.
@@ -153,13 +157,13 @@ Rule violations not in the offense table can still have bans applied, but have n
[^badFaith]: To qualify as bad faith, there should be no *reasonable* way that something is being done with good intentions. It is not required for the person to *actually* be acting in bad faith, only that it is *unreasonable* for them to think that they are.
-[^antagOnly]: Only applies to antagonists.
+[^antagOnly]: Only applies to antagonists and free agents.
[^stackEscalation]: Should be combined with an escalation offense from the perspective of the offender. Typically RDM if an execution occurs for no reason, or over escalation if there is a poor reason.
[^teachingException]: Use of admin discretion to not enact penalties is highly recommended in cases where the offending player only commits an offense after attempting and failing to teach a new player appropriately.
-[^applyToChain]: The offense may be applied to anyone in the chain of those who requested or approved the execution up to the executioner.
+[^positiveException]: Use of admin discretion to not enact penalties is highly recommended in cases where the offending player is not negatively impacting players, and is attempting to ensure players have a positive experience. For example, using LOOC to get permission to perform an IC act which would be allowed even without that permission.
[^infoFromDeath]: This includes any information that a character should have not known from the same "life". Depending on server rules, this may include information like the information leading to your death. A "life" ends when a player takes a different role, like a ghost role. For the purposes of banning guidelines, a "life" does not end on cloning.
@@ -167,7 +171,7 @@ Rule violations not in the offense table can still have bans applied, but have n
[^requiresIntent]: Offenses where the admin does not believe a violation to have been intentional may be reduced to a warning and do not need to be considered a past offense when evaluating guidelines for future offenses.
-## Modifiers Table
+## Modifiers Tables
```admonish info
> Modifiers can be applied to each offense that meets their conditions. They are typically in the form of multipliers.
@@ -183,23 +187,48 @@ An offense which lists W - 12h GB as a suggestion that is affected by a 2x multi
--------------------
+### Mitigating: Required
+
+```admonish info
+These mitigating modifiers must be applied if they are applicable.
+```
+
| Modifier | Modification |
|----------|--------------|
-| Metagrudging | 2x multiplier if the offense is the result of metagrudging by the offender. |
-| Repeat game bans | A multiplier equal to 1 plus the number of game bans in the last 6 months which resulted from offenses from other grouping categories. This multiplier can only apply to game ban suggestions, not role ban suggestions. |
-| Prior indefinite ban | Up to 7d can be added to the total game ban length if the player has had a prior indefinite ban in the last 6 months. Excluding bans used only for contact and ones where they were found to be not at fault. |
-| Round removal | 2x multiplier for any offense which results in someone being permanently removed from a round, including an attempt to do so and actions likely to result in permanent round removal. |
-| Ban request/demand | Any player who demands or requests a ban can be banned indefinitely. |
-| Lying in ahelp | 24h + 1-3x multiplier if the offender maliciously lies in the ahelp. You should be certain that they have lied. The multiplier may be applied after the 24h addition is made. |
-| Role specific | Any issue that is likely to be prevented by a role ban should include a role ban if a game ban is applied. The role ban can be applied in addition to or as an alternative to the suggested game ban. Game ban suggestions can be converted to role ban suggestion times by doubling the time. |
-| Command/Security | 1-2x multiplier if the offender is in command or security |
-| Intentional rule breaking | 2-3x multiplier. Includes any rule breaking where the player intentionally breaks a rule knowing they are breaking a rule, knowing they will get banned, or claims to not care if they get banned. Any reasonably clear rule violation can be presumed to be intentional if the player was told to read the rules in the last 12 hours. |
-| New player | Anything from a warning to the maximum suggested ban can be given to a player new to the game if they are told to read the rules, if they have not been previously told to do so, and if the minimum suggestion is not an indefinite ban. |
| Valid Rule Clarification | No more than a warning should be given to a player that justifies the offense with a reasonably cited active rule clarification, even if it is not up to date with current rules. |
+| Self report | Reduce to warning. Applies to any offense where the player reports themselves as long as the offense was unlikely to be identified otherwise. |
+
+
+### Mitigating: Discretionary
+
+```admonish info
+These mitigating modifiers are applied at the discretion of the admin and may be partially applied. Admins are highly encouraged to consider applying these when they are relevant as they can significantly help to avoid bans which will be accepted on appeal.
+```
+
+| Modifier | Modification |
+|----------|--------------|
+| New player | If there is no prior warning for the same issue, and if the minimum suggestion is not an indefinite ban, reduce to warning at admin discretion and instruct to read the rules. |
| Caught before round effects | If there are no earlier similar issues, any issue caught before it affects the round and other players can be reduced to a warning at admin discretion. |
-| Self report | Reduce to warning. Applies to any offense where the player reports themselves and where the offense was unlikely to be identified otherwise. |
| Admin intervention | Any reduction, including to nothing, may be applied for any offense which is plausibly the result of admin intervention. |
+### Aggravating
+
+```admonish info
+Aggravating modifieres are applied at the discretion of the admin and may be partially applied.
+```
+
+| Modifier | Modification |
+|----------|--------------|
+| Repeat game bans | A multiplier equal to 1 plus the number of game bans in the last 6 months which resulted from offenses from other grouping categories. |
+| Metagrudging | **2x** multiplier if the offense is the result of metagrudging by the offender. |
+| Prior indefinite ban | **7d** can be added to the total game ban length if the player has had any prior indefinite ban in the last 6 months. Excluding bans used only for contact and ones where they were found to be not at fault. |
+| Round removal | **2x** multiplier for any offense which results in someone being permanently removed from a round, including an attempt to do so and actions likely to result in permanent round removal. |
+| Lying in ahelp | **24h + 3x** multiplier if the offender maliciously lies in the ahelp. You should be certain that they have lied. The multiplier is applied after the 24h addition is made. |
+| Command/Security | **2x** multiplier if the offender is in command or security |
+| Intentional rule breaking | **3x** multiplier. Includes any rule breaking where the player intentionally breaks a rule knowing they are breaking a rule, knowing they will get banned, or claims to not care if they get banned. Any reasonably clear rule violation can be presumed to be intentional if the player was told to read the rules in the last 12 hours. |
+| Role specific | Any issue that is likely to be prevented by a role ban should include a role ban if a game ban is applied. The role ban can be applied in addition to or as an alternative to the suggested game ban. Game ban suggestions can be converted to role ban suggestion times by doubling the time. |
+| Ban request/demand | Any player who demands or requests a ban can be banned indefinitely. |
+
## Grouping and Stacking
- When separate offenses occur, the suggested time should be determined by summing the suggestions for each separate offense.
@@ -217,6 +246,10 @@ The total time of a role ban may be rounded to the nearest available autofill.
## Examples
+```admonish info
+These examples may be outdated due to a banning policy update. Please point out any issues if you notice them.
+```
+
### AME Sabotage
A technical assistant sets the AME to 50. Their offenses are:
- Self antag
@@ -244,13 +277,13 @@ No modifiers apply. Only the prior RDM offense is relevant because it is the onl
# Appeals
-## Appeals of Mistaken Bans
+## Appeals of Incorrect Bans
Unless the ban was an upgrade resulting from an unsucessful appeal, if an appeal disputes the events which were used to justify the ban, the first appeal of a voucher or permanent ban may only be declined after it has been verified that it was appropriately placed.
## Appeal Hijacking
-If an appeal is currently being processed by someone, it is generally best to let them finish processing the it. Cases where it may be acceptable to "hijack" an appeal are:
+If an appeal is currently assigned to someone, it is generally best to let them finish processing the it. Cases where it may be acceptable to "hijack" an appeal are:
- the processor has not responded to the appeal recently,
- the processor has somehow indicated that they are not going to process the appeal, or
- a head game admin has told you that you can process the appeal.
diff --git a/src/en/community/infrastructure-reference/grafana-dashboards.md b/src/en/community/infrastructure-reference/grafana-dashboards.md
index 5640725ad..8efd3ad89 100644
--- a/src/en/community/infrastructure-reference/grafana-dashboards.md
+++ b/src/en/community/infrastructure-reference/grafana-dashboards.md
@@ -5,11 +5,229 @@ Contains the export for our Grafana dashboards at the time of writing. You will
## Game Servers
```json
{
+ "__inputs": [
+ {
+ "name": "DS_PROMETHEUS",
+ "label": "Prometheus",
+ "description": "",
+ "type": "datasource",
+ "pluginId": "prometheus",
+ "pluginName": "Prometheus"
+ },
+ {
+ "name": "DS_SS14_POSTGRESQL",
+ "label": "SS14 PostgreSQL",
+ "description": "",
+ "type": "datasource",
+ "pluginId": "grafana-postgresql-datasource",
+ "pluginName": "PostgreSQL"
+ }
+ ],
+ "__elements": {
+ "ee25b1d7-c005-4e4d-965c-466296dc64db": {
+ "name": "Connections",
+ "uid": "ee25b1d7-c005-4e4d-965c-466296dc64db",
+ "kind": 1,
+ "model": {
+ "datasource": {
+ "type": "grafana-postgresql-datasource",
+ "uid": "${DS_SS14_POSTGRESQL}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": -1,
+ "drawStyle": "bars",
+ "fillOpacity": 100,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "linearThreshold": 10,
+ "log": 2,
+ "type": "symlog"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "postgres",
+ "uid": "ol4_imoGk"
+ },
+ "editorMode": "code",
+ "format": "time_series",
+ "rawQuery": true,
+ "rawSql": "SELECT\r\n \"time\",\r\n 1 as \"Connection\"\r\nFROM\r\n connection_log\r\nWHERE\r\n $__timeFilter(\"time\")\r\nGROUP BY\r\n 1",
+ "refId": "Connection",
+ "sql": {
+ "columns": [
+ {
+ "parameters": [
+ {
+ "name": "\"time\"",
+ "type": "functionParameter"
+ }
+ ],
+ "type": "function"
+ },
+ {
+ "parameters": [],
+ "type": "function"
+ }
+ ],
+ "groupBy": [
+ {
+ "property": {
+ "type": "string"
+ },
+ "type": "groupBy"
+ }
+ ],
+ "limit": 50,
+ "whereJsonTree": {
+ "children1": [
+ {
+ "id": "b89a99a9-89ab-4cde-b012-3189809a91fc",
+ "properties": {
+ "field": "\"time\"",
+ "operator": "equal",
+ "value": [
+ null
+ ],
+ "valueSrc": [
+ "value"
+ ],
+ "valueType": [
+ "datetime"
+ ]
+ },
+ "type": "rule"
+ }
+ ],
+ "id": "a989bbb9-89ab-4cde-b012-318980999ce7",
+ "type": "group"
+ }
+ },
+ "table": "connection_log"
+ },
+ {
+ "datasource": {
+ "name": "Expression",
+ "type": "__expr__",
+ "uid": "__expr__"
+ },
+ "downsampler": "sum",
+ "expression": "Connection",
+ "hide": false,
+ "refId": "Connections",
+ "type": "resample",
+ "upsampler": "fillna",
+ "window": "5m"
+ }
+ ],
+ "title": "Connections",
+ "transformations": [
+ {
+ "id": "filterByRefId",
+ "options": {
+ "include": "Connections"
+ }
+ }
+ ],
+ "type": "timeseries"
+ }
+ }
+ },
+ "__requires": [
+ {
+ "type": "grafana",
+ "id": "grafana",
+ "name": "Grafana",
+ "version": "10.4.2"
+ },
+ {
+ "type": "datasource",
+ "id": "grafana-postgresql-datasource",
+ "name": "PostgreSQL",
+ "version": "1.0.0"
+ },
+ {
+ "type": "datasource",
+ "id": "prometheus",
+ "name": "Prometheus",
+ "version": "1.0.0"
+ },
+ {
+ "type": "panel",
+ "id": "stat",
+ "name": "Stat",
+ "version": ""
+ },
+ {
+ "type": "panel",
+ "id": "timeseries",
+ "name": "Time series",
+ "version": ""
+ }
+ ],
"annotations": {
"list": [
{
"builtIn": 1,
- "datasource": "-- Grafana --",
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
@@ -27,148 +245,243 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
- "id": 1,
+ "id": null,
"links": [],
"liveNow": false,
"panels": [
{
- "aliasColors": {
- "wizards_den_eu_west": "blue"
+ "gridPos": {
+ "h": 5,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 27,
+ "libraryPanel": {
+ "uid": "ee25b1d7-c005-4e4d-965c-466296dc64db",
+ "name": "Connections"
+ }
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 30,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "stepAfter",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "short"
},
- "overrides": []
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "wizards_den_eu_west"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
},
- "fill": 3,
- "fillGradient": 0,
"gridPos": {
"h": 7,
- "w": 10,
+ "w": 12,
"x": 0,
- "y": 0
+ "y": 5
},
- "hiddenSeries": false,
"id": 2,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 2,
- "nullPointMode": "null",
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": true,
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.2.3",
"targets": [
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
"expr": "robust_player_count",
"interval": "",
- "legendFormat": "{{job}}",
+ "legendFormat": "{{server}}",
"refId": "A"
}
],
- "thresholds": [],
- "timeRegions": [],
"title": "Player Count",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "decimals": 0,
- "format": "short",
- "logBase": 1,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "logBase": 1,
- "show": true
- }
- ],
- "yaxis": {
- "align": false
- }
+ "type": "timeseries"
},
{
- "aliasColors": {
- "wizards_den_eu_west": "blue"
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 30,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "stepAfter",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "short"
},
- "overrides": []
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "wizards_den_eu_west"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
},
- "fill": 3,
- "fillGradient": 0,
"gridPos": {
"h": 7,
- "w": 10,
- "x": 10,
- "y": 0
+ "w": 12,
+ "x": 12,
+ "y": 5
},
- "hiddenSeries": false,
"id": 23,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 2,
- "nullPointMode": "null",
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": true,
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.2.3",
"targets": [
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"exemplar": true,
"expr": "sum(robust_player_count)",
"interval": "",
@@ -176,37 +489,8 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"refId": "A"
}
],
- "thresholds": [],
- "timeRegions": [],
"title": "Total Player Count",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "decimals": 0,
- "format": "short",
- "logBase": 1,
- "min": "0",
- "show": true
- },
- {
- "format": "short",
- "logBase": 1,
- "show": true
- }
- ],
- "yaxis": {
- "align": false
- }
+ "type": "timeseries"
},
{
"alert": {
@@ -215,9 +499,10 @@ Contains the export for our Grafana dashboards at the time of writing. You will
{
"evaluator": {
"params": [
+ 1,
28
],
- "type": "lt"
+ "type": "within_range"
},
"operator": {
"type": "and"
@@ -248,462 +533,466 @@ Contains the export for our Grafana dashboards at the time of writing. You will
}
]
},
- "aliasColors": {
- "PlayerCount wizards_den_us_west": "dark-orange",
- "wizards_den_eu_west": "blue"
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "line+area"
+ }
+ },
+ "links": [],
+ "mappings": [],
+ "max": 35,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "transparent",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ },
+ {
+ "color": "transparent",
+ "value": 28
+ }
+ ]
+ },
+ "unit": "hertz"
},
- "overrides": []
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "PlayerCount wizards_den_us_west"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "wizards_den_eu_west"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
"h": 6,
- "w": 10,
+ "w": 12,
"x": 0,
- "y": 7
+ "y": 12
},
- "hiddenSeries": false,
"id": 4,
- "legend": {
- "alignAsTable": false,
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 2,
- "nullPointMode": "null",
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.2.3",
"targets": [
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
"expr": "rate(robust_server_curtick[30s])",
"interval": "",
- "legendFormat": "{{job}}",
+ "legendFormat": "{{server}}",
"refId": "A"
}
],
- "thresholds": [
- {
- "colorMode": "critical",
- "fill": true,
- "line": true,
- "op": "lt",
- "value": 28,
- "visible": true
- }
- ],
- "timeRegions": [],
"title": "TPS",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "format": "hertz",
- "logBase": 1,
- "max": "35",
- "min": "0",
- "show": true
- },
- {
- "decimals": 0,
- "format": "short",
- "logBase": 1,
- "show": false
- }
- ],
- "yaxis": {
- "align": false
- }
+ "type": "timeseries"
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "Current round length",
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "blue",
+ "value": null
+ },
+ {
+ "color": "green",
+ "value": 1
+ },
+ {
+ "color": "yellow",
+ "value": 7200
+ },
+ {
+ "color": "orange",
+ "value": 9000
+ },
+ {
+ "color": "red",
+ "value": 10800
+ }
+ ]
+ },
+ "unit": "dthms"
},
"overrides": []
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
- "h": 6,
- "w": 10,
- "x": 10,
- "y": 7
- },
- "hiddenSeries": false,
- "id": 12,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
+ "h": 24,
+ "w": 2,
+ "x": 12,
+ "y": 12
},
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
+ "id": 28,
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "rate(process_cpu_seconds_total[10s])",
- "interval": "",
- "legendFormat": "{{job}}",
- "refId": "A"
- }
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "CPU Usage",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "decimals": 1,
- "format": "percentunit",
- "logBase": 1,
- "max": "1",
- "min": "0",
- "show": true
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "center",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
},
- {
- "format": "short",
- "logBase": 1,
- "show": false
- }
- ],
- "yaxis": {
- "align": false
- }
- },
- {
- "alert": {
- "alertRuleTags": {},
- "conditions": [
- {
- "evaluator": {
- "params": [
- 520850446
- ],
- "type": "gt"
- },
- "operator": {
- "type": "and"
- },
- "query": {
- "params": [
- "A",
- "1m",
- "now"
- ]
- },
- "reducer": {
- "params": [],
- "type": "max"
- },
- "type": "query"
- }
- ],
- "executionErrorState": "alerting",
- "for": "5m",
- "frequency": "1m",
- "handler": 1,
- "message": "Memory Usage Alert",
- "name": "Managed Memory alert",
- "noDataState": "no_data",
- "notifications": [
- {
- "uid": "N5nihcmMk"
- }
- ]
- },
- "aliasColors": {
- "wizards_den_eu_west": "blue"
- },
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "fieldConfig": {
- "defaults": {
- "links": []
+ "showPercentChange": false,
+ "text": {
+ "valueSize": 40
},
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 6,
- "w": 10,
- "x": 0,
- "y": 13
+ "textMode": "value",
+ "wideLayout": true
},
- "hiddenSeries": false,
- "id": 9,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "dotnet_total_memory_bytes",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "ss14_round_length{job=\"gameservers\"}",
"format": "time_series",
+ "instant": true,
"interval": "",
- "legendFormat": "{{job}}",
+ "legendFormat": "{{server}}",
+ "range": false,
"refId": "A"
}
],
- "thresholds": [
- {
- "colorMode": "critical",
- "fill": true,
- "line": true,
- "op": "gt",
- "value": 520850446,
- "visible": true
- }
- ],
- "timeRegions": [],
- "title": "Managed Memory",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "$$hashKey": "object:560",
- "format": "bytes",
- "logBase": 1,
- "min": "0",
- "show": true
- },
- {
- "$$hashKey": "object:561",
- "format": "short",
- "logBase": 1,
- "show": true
- }
- ],
- "yaxis": {
- "align": false
- }
+ "title": "Current round length",
+ "type": "stat"
},
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"description": "",
"fieldConfig": {
"defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
+ "color": "red",
"value": null
+ },
+ {
+ "color": "orange",
+ "value": 5
+ },
+ {
+ "color": "#EAB839",
+ "value": 15
+ },
+ {
+ "color": "green",
+ "value": 25
+ },
+ {
+ "color": "green",
+ "value": 60
+ },
+ {
+ "color": "blue",
+ "value": 70
}
]
- },
- "unit": "dthms"
+ }
},
"overrides": []
},
"gridPos": {
- "h": 3,
- "w": 5,
- "x": 10,
- "y": 13
+ "h": 24,
+ "w": 8,
+ "x": 14,
+ "y": 12
},
- "id": 6,
+ "id": 15,
"options": {
"colorMode": "value",
- "graphMode": "none",
- "justifyMode": "auto",
- "orientation": "auto",
+ "graphMode": "area",
+ "justifyMode": "center",
+ "orientation": "horizontal",
"reduceOptions": {
"calcs": [
- "last"
+ "lastNotNull"
],
"fields": "",
"values": false
},
+ "showPercentChange": false,
"text": {},
- "textMode": "auto"
+ "textMode": "auto",
+ "wideLayout": true
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.4.2",
"targets": [
{
- "exemplar": true,
- "expr": "ss14_round_length{job=\"wizards_den_lizard\"}",
- "instant": true,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "builder",
+ "exemplar": false,
+ "expr": "robust_player_count",
+ "format": "time_series",
+ "instant": false,
"interval": "",
- "legendFormat": "",
+ "legendFormat": "{{server}}",
+ "range": true,
"refId": "A"
}
],
- "title": "US West Round Duration",
+ "title": "Player counts",
"type": "stat"
},
{
- "description": "US west playercount",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "Average round length over the selected range",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
- "displayName": "Players",
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
+ "color": "red",
"value": null
+ },
+ {
+ "color": "orange",
+ "value": 1800
+ },
+ {
+ "color": "#EAB839",
+ "value": 2700
+ },
+ {
+ "color": "green",
+ "value": 3600
+ },
+ {
+ "color": "green",
+ "value": 5400
+ },
+ {
+ "color": "yellow",
+ "value": 7200
+ },
+ {
+ "color": "orange",
+ "value": 9000
+ },
+ {
+ "color": "red",
+ "value": 10800
}
]
},
- "unit": "none"
+ "unit": "dthms"
},
"overrides": []
},
"gridPos": {
- "h": 3,
+ "h": 24,
"w": 2,
- "x": 15,
- "y": 13
+ "x": 22,
+ "y": 12
},
- "id": 15,
- "links": [],
+ "id": 24,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "center",
- "orientation": "auto",
+ "orientation": "horizontal",
"reduceOptions": {
"calcs": [
- "last"
+ "lastNotNull"
],
"fields": "",
"values": false
},
- "text": {},
- "textMode": "auto"
+ "showPercentChange": false,
+ "text": {
+ "valueSize": 40
+ },
+ "textMode": "value",
+ "wideLayout": true
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "robust_player_count",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "$__range_s / increase(ss14_round_number[$__range])",
"format": "time_series",
"instant": true,
"interval": "",
- "legendFormat": "{{job}}",
+ "legendFormat": "{{server}}",
+ "range": false,
"refId": "A"
}
],
- "title": "USW",
- "transformations": [
- {
- "id": "filterFieldsByName",
- "options": {
- "include": {
- "names": [
- "Time",
- "wizards_den_lizard"
- ]
- }
- }
- }
- ],
+ "title": "Average round length",
"type": "stat"
},
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
"color": {
- "mode": "thresholds"
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
},
+ "decimals": 1,
+ "links": [],
"mappings": [],
+ "max": 1,
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
@@ -716,106 +1005,1647 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"value": 80
}
]
- }
+ },
+ "unit": "percentunit"
},
"overrides": []
},
"gridPos": {
- "h": 3,
- "w": 2,
- "x": 18,
- "y": 13
+ "h": 6,
+ "w": 12,
+ "x": 0,
+ "y": 18
},
- "id": 25,
+ "id": 12,
"options": {
- "colorMode": "value",
- "graphMode": "area",
- "justifyMode": "auto",
- "orientation": "auto",
- "reduceOptions": {
- "calcs": [
- "lastNotNull"
- ],
- "fields": "",
- "values": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- "text": {},
- "textMode": "auto"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.2.3",
"targets": [
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
"exemplar": true,
- "expr": "sum(robust_player_count)",
+ "expr": "rate(process_cpu_seconds_total[$__rate_interval])",
"interval": "",
- "legendFormat": "",
+ "legendFormat": "{{server}}",
+ "range": true,
"refId": "A"
}
],
- "title": "Total Players",
- "type": "stat"
+ "title": "CPU Usage",
+ "type": "timeseries"
},
{
- "description": "",
- "fieldConfig": {
- "defaults": {
- "mappings": [],
- "thresholds": {
- "mode": "absolute",
- "steps": [
- {
- "color": "green",
- "value": null
- }
- ]
- },
- "unit": "dthms"
- },
- "overrides": []
- },
- "gridPos": {
- "h": 3,
- "w": 5,
- "x": 10,
- "y": 16
- },
- "id": 7,
- "options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "auto",
- "orientation": "auto",
+ "alert": {
+ "alertRuleTags": {},
+ "conditions": [
+ {
+ "evaluator": {
+ "params": [
+ 520850446
+ ],
+ "type": "gt"
+ },
+ "operator": {
+ "type": "and"
+ },
+ "query": {
+ "params": [
+ "A",
+ "1m",
+ "now"
+ ]
+ },
+ "reducer": {
+ "params": [],
+ "type": "max"
+ },
+ "type": "query"
+ }
+ ],
+ "executionErrorState": "alerting",
+ "for": "5m",
+ "frequency": "1m",
+ "handler": 1,
+ "message": "Memory Usage Alert",
+ "name": "Managed Memory alert",
+ "noDataState": "no_data",
+ "notifications": [
+ {
+ "uid": "N5nihcmMk"
+ }
+ ]
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "line+area"
+ }
+ },
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "transparent",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 520850446
+ }
+ ]
+ },
+ "unit": "bytes"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "wizards_den_eu_west"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 0,
+ "y": 24
+ },
+ "id": 9,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.4.2",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "dotnet_total_memory_bytes",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{server}}",
+ "refId": "A"
+ }
+ ],
+ "title": "Managed Memory",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "wizards_den_eu_west"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 0,
+ "y": 30
+ },
+ "id": 22,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.4.2",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "robust_server_uptime",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{server}}",
+ "refId": "A"
+ }
+ ],
+ "title": "Server Uptime",
+ "type": "timeseries"
+ }
+ ],
+ "refresh": "",
+ "schemaVersion": 39,
+ "tags": [
+ "game servers"
+ ],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Game Servers",
+ "uid": "K0LTdKmMk",
+ "version": 60,
+ "weekStart": ""
+}
+```
+
+## Perf Metrics
+
+```json
+{
+ "__inputs": [
+ {
+ "name": "DS_PROMETHEUS",
+ "label": "Prometheus",
+ "description": "",
+ "type": "datasource",
+ "pluginId": "prometheus",
+ "pluginName": "Prometheus"
+ },
+ {
+ "name": "DS_LOKI",
+ "label": "Loki",
+ "description": "",
+ "type": "datasource",
+ "pluginId": "loki",
+ "pluginName": "Loki"
+ }
+ ],
+ "__elements": {},
+ "__requires": [
+ {
+ "type": "panel",
+ "id": "bargauge",
+ "name": "Bar gauge",
+ "version": ""
+ },
+ {
+ "type": "grafana",
+ "id": "grafana",
+ "name": "Grafana",
+ "version": "10.4.2"
+ },
+ {
+ "type": "panel",
+ "id": "heatmap",
+ "name": "Heatmap",
+ "version": ""
+ },
+ {
+ "type": "panel",
+ "id": "logs",
+ "name": "Logs",
+ "version": ""
+ },
+ {
+ "type": "datasource",
+ "id": "loki",
+ "name": "Loki",
+ "version": "1.0.0"
+ },
+ {
+ "type": "panel",
+ "id": "piechart",
+ "name": "Pie chart",
+ "version": ""
+ },
+ {
+ "type": "datasource",
+ "id": "prometheus",
+ "name": "Prometheus",
+ "version": "1.0.0"
+ },
+ {
+ "type": "panel",
+ "id": "stat",
+ "name": "Stat",
+ "version": ""
+ },
+ {
+ "type": "panel",
+ "id": "timeseries",
+ "name": "Time series",
+ "version": ""
+ }
+ ],
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "target": {
+ "limit": 100,
+ "matchAny": false,
+ "tags": [],
+ "type": "dashboard"
+ },
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "graphTooltip": 0,
+ "id": null,
+ "links": [],
+ "liveNow": false,
+ "panels": [
+ {
+ "collapsed": true,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "fugZSFmMk"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 61,
+ "panels": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 3,
+ "x": 0,
+ "y": 9
+ },
+ "id": 53,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "name",
+ "wideLayout": true
+ },
+ "pluginVersion": "10.2.3",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "dotnet_build_info{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "{{runtime_version}}",
+ "refId": "A"
+ }
+ ],
+ "title": "Runtime Version",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 10,
+ "x": 3,
+ "y": 9
+ },
+ "id": 54,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "name",
+ "wideLayout": true
+ },
+ "pluginVersion": "10.2.3",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "dotnet_build_info{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "{{os_version}}",
+ "refId": "A"
+ }
+ ],
+ "title": "OS Version",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 3,
+ "x": 13,
+ "y": 9
+ },
+ "id": 55,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "name",
+ "wideLayout": true
+ },
+ "pluginVersion": "10.2.3",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "dotnet_build_info{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "{{gc_mode}}",
+ "refId": "A"
+ }
+ ],
+ "title": "GC Mode",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 3,
+ "x": 16,
+ "y": 9
+ },
+ "id": 57,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "10.2.3",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "process_cpu_count{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "title": "Processor Count",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_LOKI}"
+ },
+ "description": "",
+ "gridPos": {
+ "h": 7,
+ "w": 19,
+ "x": 0,
+ "y": 12
+ },
+ "id": 34,
+ "options": {
+ "dedupStrategy": "none",
+ "enableLogDetails": true,
+ "prettifyLogMessage": false,
+ "showCommonLabels": false,
+ "showLabels": false,
+ "showTime": false,
+ "sortOrder": "Descending",
+ "wrapLogMessage": false
+ },
+ "targets": [
+ {
+ "expr": "{App=\"Robust.Server\",Server=\"$Server\"}",
+ "refId": "A",
+ "datasource": {
+ "type": "loki",
+ "uid": "${DS_LOKI}"
+ }
+ }
+ ],
+ "title": "Logs",
+ "transformations": [],
+ "type": "logs"
+ }
+ ],
+ "title": "Info",
+ "type": "row"
+ },
+ {
+ "collapsed": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "fugZSFmMk"
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 1
+ },
+ "id": 24,
+ "panels": [],
+ "title": "CPU",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "links": [],
+ "mappings": [],
+ "max": 3,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "percentunit"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 6,
+ "x": 0,
+ "y": 2
+ },
+ "id": 13,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.2.3",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(process_cpu_seconds_total{server=\"$Server\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "CPU Usage",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "dthms"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 6,
+ "y": 2
+ },
+ "id": 15,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "last"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "text": {},
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "10.4.2",
+ "targets": [
+ {
+ "expr": "robust_server_uptime{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ }
+ }
+ ],
+ "title": "Uptime",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "dthms"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 10,
+ "y": 2
+ },
+ "id": 16,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "last"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "text": {},
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "10.4.2",
+ "targets": [
+ {
+ "expr": "robust_server_curtime{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ }
+ }
+ ],
+ "title": "CurTime",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "short"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 14,
+ "y": 2
+ },
+ "id": 36,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.4.2",
+ "targets": [
+ {
+ "expr": "robust_player_count{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "{{job}}",
+ "refId": "A",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ }
+ }
+ ],
+ "title": "Player Count",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 15,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 0,
+ "y": 6
+ },
+ "id": 80,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "exemplar": true,
+ "expr": "rate(robust_game_loop_frametime_sum{server=\"$Server\"}[$__rate_interval]) / rate(robust_game_loop_frametime_count{server=\"$Server\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Avg Tick Duration (3m)",
+ "type": "timeseries"
+ },
+ {
+ "cards": {},
+ "color": {
+ "cardColor": "#b4ff00",
+ "colorScale": "sqrt",
+ "colorScheme": "interpolateGreens",
+ "exponent": 0.5,
+ "mode": "opacity"
+ },
+ "dataFormat": "tsbuckets",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "How long gameloop ticks take.",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "scaleDistribution": {
+ "type": "linear"
+ }
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 7,
+ "x": 5,
+ "y": 6
+ },
+ "heatmap": {},
+ "hideZeroBuckets": false,
+ "highlightCards": true,
+ "id": 2,
+ "legend": {
+ "show": false
+ },
+ "options": {
+ "calculate": false,
+ "calculation": {},
+ "cellGap": 2,
+ "cellValues": {},
+ "color": {
+ "exponent": 0.5,
+ "fill": "#b4ff00",
+ "mode": "opacity",
+ "reverse": false,
+ "scale": "exponential",
+ "scheme": "Oranges",
+ "steps": 128
+ },
+ "exemplars": {
+ "color": "rgba(255,0,255,0.7)"
+ },
+ "filterValues": {
+ "le": 1e-9
+ },
+ "legend": {
+ "show": false
+ },
+ "rowsFrame": {
+ "layout": "auto"
+ },
+ "showValue": "never",
+ "tooltip": {
+ "mode": "single",
+ "showColorScale": false,
+ "yHistogram": false
+ },
+ "yAxis": {
+ "axisPlacement": "left",
+ "decimals": 0,
+ "reverse": false,
+ "unit": "s"
+ }
+ },
+ "pluginVersion": "10.4.2",
+ "reverseYBuckets": false,
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_game_loop_frametime_bucket{server=\"$Server\"}[$__rate_interval])",
+ "format": "heatmap",
+ "interval": "",
+ "legendFormat": "{{le}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Tick Duration",
+ "tooltip": {
+ "show": true,
+ "showHistogram": false
+ },
+ "type": "heatmap",
+ "xAxis": {
+ "show": true
+ },
+ "yAxis": {
+ "decimals": 0,
+ "format": "s",
+ "logBase": 1,
+ "show": true
+ },
+ "yBucketBound": "auto"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "links": [],
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "hertz"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 7,
+ "x": 12,
+ "y": 6
+ },
+ "id": 4,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.2.3",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_server_curtick{server=\"$Server\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Tickrate",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ }
+ },
+ "decimals": 0,
+ "mappings": [],
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 0,
+ "y": 12
+ },
+ "id": 43,
+ "options": {
+ "displayLabels": [],
+ "legend": {
+ "calcs": [],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true,
+ "values": [
+ "value"
+ ]
+ },
+ "pieType": "pie",
"reduceOptions": {
"calcs": [
- "last"
+ "lastNotNull"
],
"fields": "",
"values": false
},
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "7.3.2",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "expr": "topk(10, histogram_quantile(0.95, sum(rate(robust_entity_systems_update_usage_bucket{server=\"$Server\"}[5m])) by (le, system)))",
+ "interval": "",
+ "legendFormat": "{{system}}",
+ "refId": "A"
+ }
+ ],
+ "title": "95% System Tick Chart",
+ "type": "piechart"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 0.001
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 7,
+ "x": 5,
+ "y": 12
+ },
+ "id": 41,
+ "options": {
+ "displayMode": "gradient",
+ "maxVizHeight": 300,
+ "minVizHeight": 17,
+ "minVizWidth": 0,
+ "namePlacement": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "mean"
+ ],
+ "fields": "",
+ "values": true
+ },
+ "showUnfilled": true,
+ "sizing": "manual",
"text": {},
- "textMode": "auto"
+ "valueMode": "color"
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "ss14_round_length{job=\"wizards_den_eu_west\"}",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "expr": "topk(100, histogram_quantile(0.95, sum(rate(robust_entity_systems_update_usage_bucket{server=\"$Server\"}[5m])) by (le, system)))",
+ "format": "time_series",
"instant": true,
"interval": "",
- "legendFormat": "",
+ "legendFormat": "{{system}}",
"refId": "A"
}
],
- "title": "EU West Round Duration",
- "type": "stat"
+ "title": "95% System Tick Breakdown",
+ "type": "bargauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ }
+ },
+ "decimals": 0,
+ "mappings": [],
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 7,
+ "x": 12,
+ "y": 12
+ },
+ "id": 39,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true,
+ "values": [
+ "value",
+ "percent"
+ ]
+ },
+ "pieType": "pie",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "7.1.5",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "histogram_quantile(0.95, sum(rate(robust_server_update_usage_bucket{server=\"$Server\"}[1m])) by (le, area))",
+ "interval": "",
+ "legendFormat": "{{area}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "95% Main Tick Timing",
+ "type": "piechart"
},
{
- "description": "EU west playercount",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
- "displayName": "Players",
"mappings": [],
"thresholds": {
"mode": "absolute",
@@ -823,929 +2653,1788 @@ Contains the export for our Grafana dashboards at the time of writing. You will
{
"color": "green",
"value": null
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
},
- "unit": "none"
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 5,
+ "x": 0,
+ "y": 18
+ },
+ "id": 45,
+ "options": {
+ "displayMode": "gradient",
+ "maxVizHeight": 300,
+ "minVizHeight": 10,
+ "minVizWidth": 0,
+ "namePlacement": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true,
+ "sizing": "auto",
+ "text": {},
+ "valueMode": "color"
+ },
+ "pluginVersion": "10.4.2",
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.95, sum(rate(robust_entity_physics_controller_before_solve_bucket{server=\"$Server\"}[5m])) by (le, controller))",
+ "interval": "",
+ "legendFormat": "{{controller}}",
+ "refId": "A",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ }
+ }
+ ],
+ "title": "Controller Tick Breakdown",
+ "type": "bargauge"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 27,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "cps"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 5,
+ "y": 20
+ },
+ "id": 91,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(dotnet_contention_total{server=\"$Server\"}[$__rate_interval])",
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Lock Contentions",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
},
"overrides": []
},
"gridPos": {
- "h": 3,
- "w": 2,
- "x": 15,
- "y": 16
+ "h": 4,
+ "w": 3,
+ "x": 10,
+ "y": 20
},
- "id": 16,
- "links": [],
+ "id": 73,
"options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "center",
+ "colorMode": "none",
+ "graphMode": "area",
+ "justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
- "last"
+ "lastNotNull"
],
"fields": "",
"values": false
},
- "text": {},
- "textMode": "auto"
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "robust_player_count",
- "format": "time_series",
- "instant": true,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "dotnet_jit_method_total{server=\"$Server\"}",
"interval": "",
- "legendFormat": "{{job}}",
+ "legendFormat": "",
"refId": "A"
}
],
- "title": "EUW",
- "transformations": [
- {
- "id": "filterFieldsByName",
- "options": {
- "include": {
- "names": [
- "Time",
- "wizards_den_eu_west"
- ]
- }
- }
- }
- ],
+ "title": "Total Methods JITed",
"type": "stat"
},
{
- "aliasColors": {
- "wizards_den_eu_west": "blue"
- },
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "fieldConfig": {
- "defaults": {
- "links": []
- },
- "overrides": []
+ "collapsed": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "fugZSFmMk"
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
- "h": 6,
- "w": 10,
+ "h": 1,
+ "w": 24,
"x": 0,
- "y": 19
+ "y": 26
},
- "hiddenSeries": false,
"id": 22,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null as zero",
- "options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "robust_server_uptime",
- "format": "time_series",
- "interval": "",
- "legendFormat": "{{job}}",
- "refId": "A"
- }
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "Server Uptime",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "$$hashKey": "object:560",
- "format": "s",
- "logBase": 1,
- "min": "0",
- "show": true
- },
- {
- "$$hashKey": "object:561",
- "format": "short",
- "logBase": 1,
- "show": true
- }
- ],
- "yaxis": {
- "align": false
- }
+ "panels": [],
+ "title": "Network",
+ "type": "row"
},
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"description": "",
"fieldConfig": {
"defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "links": [],
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
},
- "unit": "dthms"
+ "unit": "Bps"
},
- "overrides": []
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Send"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
},
"gridPos": {
- "h": 3,
- "w": 5,
- "x": 10,
- "y": 19
+ "h": 6,
+ "w": 7,
+ "x": 0,
+ "y": 27
},
- "id": 13,
+ "id": 6,
"options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "auto",
- "orientation": "auto",
- "reduceOptions": {
- "calcs": [
- "last"
- ],
- "fields": "",
- "values": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- "text": {},
- "textMode": "auto"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.2.3",
"targets": [
{
- "expr": "ss14_round_length{job=\"wizards_den_eu_west_2\"}",
- "instant": true,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_recv_bytes{server=\"$Server\"}[$__rate_interval])",
"interval": "",
- "legendFormat": "",
+ "legendFormat": "Receive",
+ "range": true,
"refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_sent_bytes{server=\"$Server\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Send",
+ "range": true,
+ "refId": "B"
}
],
- "title": "EU West 2 Round Duration",
- "type": "stat"
+ "title": "Network Usage",
+ "type": "timeseries"
},
{
- "description": "EU west 2 playercount",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "* Packets: real UDP packets.\n* Messages: Lidgren messages.\n\nLidgren can combine multiple messages into one UDP packet so these numbers are not necessarily equal. ",
"fieldConfig": {
"defaults": {
"color": {
- "mode": "thresholds"
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
},
- "displayName": "Players",
+ "decimals": 0,
+ "links": [],
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
},
- "unit": "none"
+ "unit": "pps"
},
- "overrides": []
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Receive Messages"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Receive Packets"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Send"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Send Messages"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "semi-dark-blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Send Packets"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
},
"gridPos": {
- "h": 3,
- "w": 2,
- "x": 15,
- "y": 19
+ "h": 6,
+ "w": 7,
+ "x": 7,
+ "y": 27
},
- "id": 17,
- "links": [],
+ "id": 7,
"options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "center",
- "orientation": "auto",
- "reduceOptions": {
- "calcs": [
- "last"
- ],
- "fields": "",
- "values": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- "text": {},
- "textMode": "auto"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.2.3",
"targets": [
{
- "expr": "robust_player_count",
- "format": "time_series",
- "instant": true,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_recv_packets{server=\"$Server\"}[$__rate_interval])",
"interval": "",
- "legendFormat": "{{job}}",
+ "legendFormat": "Receive Packets",
+ "range": true,
"refId": "A"
- }
- ],
- "title": "EUW2",
- "transformations": [
+ },
{
- "id": "filterFieldsByName",
- "options": {
- "include": {
- "names": [
- "Time",
- "wizards_den_eu_west_2"
- ]
- }
- }
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_sent_packets{server=\"$Server\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Send Packets",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_sent_messages{server=\"$Server\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Send Messages",
+ "range": true,
+ "refId": "C"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_recv_messages{server=\"$Server\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Receive Messages",
+ "range": true,
+ "refId": "D"
}
],
- "type": "stat"
+ "title": "Packets",
+ "type": "timeseries"
},
{
- "description": "",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "How many messages are currently stored by Lidgren.\n\n* Stored: Reliable messages that are stored in case they need to be re-sent.\n* Unsent: Messages that have not yet been sent because of network overload.",
"fieldConfig": {
"defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "links": [],
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
},
- "unit": "dthms"
+ "unit": "none"
},
"overrides": []
},
"gridPos": {
- "h": 3,
- "w": 5,
- "x": 10,
- "y": 22
- },
- "id": 10,
- "options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "auto",
- "orientation": "auto",
- "reduceOptions": {
- "calcs": [
- "last"
- ],
- "fields": "",
- "values": false
+ "h": 5,
+ "w": 6,
+ "x": 0,
+ "y": 33
+ },
+ "id": 28,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- "text": {},
- "textMode": "auto"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.2.3",
"targets": [
{
- "expr": "ss14_round_length{job=\"wizards_den_centipede\"}",
- "instant": true,
+ "expr": "robust_net_stored{server=\"$Server\"}",
"interval": "",
- "legendFormat": "",
- "refId": "A"
+ "legendFormat": "Stored",
+ "refId": "A",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ }
+ },
+ {
+ "expr": "robust_net_unsent{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "Unsent",
+ "refId": "B",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ }
}
],
- "title": "Oceania Round Duration",
- "type": "stat"
+ "title": "Stored Messages",
+ "type": "timeseries"
},
{
- "description": "Oceania playercount",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "How many reliable messages are being re-sent by Lidgren.",
"fieldConfig": {
"defaults": {
"color": {
- "mode": "thresholds"
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
},
- "displayName": "Players",
+ "decimals": 0,
+ "links": [],
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
},
- "unit": "none"
+ "unit": "short"
},
"overrides": []
},
"gridPos": {
- "h": 3,
- "w": 2,
- "x": 15,
- "y": 22
+ "h": 5,
+ "w": 6,
+ "x": 6,
+ "y": 33
},
- "id": 18,
- "links": [],
+ "id": 30,
"options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "center",
- "orientation": "auto",
- "reduceOptions": {
- "calcs": [
- "last"
- ],
- "fields": "",
- "values": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- "text": {},
- "textMode": "auto"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.2.3",
"targets": [
{
- "expr": "robust_player_count",
- "format": "time_series",
- "instant": true,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_resent_delay{server=\"$Server\"}[$__rate_interval])",
"interval": "",
- "legendFormat": "{{job}}",
+ "legendFormat": "Delay",
+ "range": true,
"refId": "A"
- }
- ],
- "title": "OCE",
- "transformations": [
+ },
{
- "id": "filterFieldsByName",
- "options": {
- "include": {
- "names": [
- "Time",
- "wizards_den_centipede"
- ]
- }
- }
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_resent_hole{server=\"$Server\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Holes",
+ "range": true,
+ "refId": "B"
}
],
- "type": "stat"
+ "title": "Resent Messages",
+ "type": "timeseries"
},
{
- "description": "",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "How many messages are getting dropped by Lidgren. This usually indicates duplicates or sequencing issues.",
"fieldConfig": {
"defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "links": [],
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
},
- "unit": "dthms"
+ "unit": "short"
},
"overrides": []
},
"gridPos": {
- "h": 3,
- "w": 5,
- "x": 10,
- "y": 25
+ "h": 5,
+ "w": 6,
+ "x": 12,
+ "y": 33
},
- "id": 14,
+ "id": 32,
"options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "auto",
- "orientation": "auto",
- "reduceOptions": {
- "calcs": [
- "last"
- ],
- "fields": "",
- "values": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
},
- "text": {},
- "textMode": "auto"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.2.3",
"targets": [
{
- "expr": "ss14_round_length{job=\"raspberry\"}",
- "instant": true,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_dropped{server=\"$Server\"}[$__rate_interval])",
"interval": "",
"legendFormat": "",
+ "range": true,
"refId": "A"
}
],
- "title": "Raspberry Round Duration",
- "type": "stat"
+ "title": "Dropped Messages",
+ "type": "timeseries"
},
{
- "description": "Gradient/Raspberry playercount",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "Shows ratio of the mapped string serializer getting hit. That means a string of text over the network could be sent as an integer ID instead of the full contents.",
"fieldConfig": {
"defaults": {
"color": {
- "mode": "thresholds"
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "percent"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
},
- "displayName": "Players",
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
- },
- "unit": "none"
+ }
},
- "overrides": []
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Hit"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Miss"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
},
"gridPos": {
- "h": 3,
- "w": 2,
- "x": 15,
- "y": 25
+ "h": 7,
+ "w": 6,
+ "x": 0,
+ "y": 38
},
- "id": 19,
- "links": [],
+ "id": 84,
"options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "center",
- "orientation": "auto",
- "reduceOptions": {
- "calcs": [
- "last"
- ],
- "fields": "",
- "values": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- "text": {},
- "textMode": "auto"
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
},
- "pluginVersion": "8.3.2",
"targets": [
{
- "expr": "robust_player_count",
- "format": "time_series",
- "instant": true,
- "interval": "",
- "legendFormat": "{{job}}",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_string_hit{server=\"$Server\"}[$__rate_interval])",
+ "legendFormat": "Hit",
+ "range": true,
"refId": "A"
- }
- ],
- "title": "RSP",
- "transformations": [
+ },
{
- "id": "filterFieldsByName",
- "options": {
- "include": {
- "names": [
- "raspberry",
- "Time"
- ]
- }
- }
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "rate(robust_net_string_miss{server=\"$Server\"}[$__rate_interval])",
+ "hide": false,
+ "legendFormat": "Miss",
+ "range": true,
+ "refId": "B"
}
],
- "type": "stat"
- }
- ],
- "refresh": false,
- "schemaVersion": 33,
- "style": "dark",
- "tags": [
- "game servers"
- ],
- "templating": {
- "list": []
- },
- "time": {
- "from": "now-15m",
- "to": "now"
- },
- "timepicker": {
- "refresh_intervals": [
- "10s",
- "30s",
- "1m",
- "5m",
- "15m",
- "30m",
- "1h",
- "2h",
- "1d"
- ]
- },
- "timezone": "",
- "title": "Game Servers",
- "uid": "K0LTdKmMk",
- "version": 52,
- "weekStart": ""
-}
-```
-
-## Perf Metrics
-
-```json
-{
- "annotations": {
- "list": [
- {
- "builtIn": 1,
- "datasource": "-- Grafana --",
- "enable": true,
- "hide": true,
- "iconColor": "rgba(0, 211, 255, 1)",
- "name": "Annotations & Alerts",
- "target": {
- "limit": 100,
- "matchAny": false,
- "tags": [],
- "type": "dashboard"
- },
- "type": "dashboard"
- }
- ]
- },
- "editable": true,
- "fiscalYearStartMonth": 0,
- "graphTooltip": 0,
- "id": 2,
- "iteration": 1640259621461,
- "links": [],
- "liveNow": false,
- "panels": [
+ "title": "Mapped string hit rate",
+ "type": "timeseries"
+ },
{
"datasource": {
- "type": "loki",
- "uid": "DSc4tCGMk"
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 0,
+ "displayName": "Asd",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
},
- "description": "",
"gridPos": {
"h": 7,
- "w": 19,
- "x": 0,
- "y": 0
+ "w": 6,
+ "x": 6,
+ "y": 38
},
- "id": 34,
+ "id": 86,
"options": {
- "dedupStrategy": "none",
- "enableLogDetails": true,
- "prettifyLogMessage": false,
- "showCommonLabels": false,
- "showLabels": false,
- "showTime": false,
- "sortOrder": "Descending",
- "wrapLogMessage": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
},
"targets": [
{
- "expr": "{App=\"Robust.Server\",Server=\"$Server\"}",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(robust_net_string_miss_chars{server=\"$Server\"}[$__rate_interval])",
+ "legendFormat": "__auto",
+ "range": true,
"refId": "A"
}
],
- "title": "Logs",
- "transformations": [],
- "type": "logs"
+ "title": "String serializer missed chars per second",
+ "type": "timeseries"
},
{
"collapsed": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "fugZSFmMk"
+ },
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
- "y": 7
+ "y": 45
},
- "id": 24,
+ "id": 20,
"panels": [],
- "title": "CPU",
+ "title": "Memory",
"type": "row"
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "fieldConfig": {
- "defaults": {
- "links": []
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 4,
- "w": 6,
- "x": 0,
- "y": 8
- },
- "hiddenSeries": false,
- "id": 13,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": false,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "rate(process_cpu_seconds_total{job=\"$Server\"}[10s])",
- "interval": "",
- "legendFormat": "",
- "refId": "A"
- }
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "CPU Usage",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
},
- "yaxes": [
- {
- "$$hashKey": "object:957",
- "decimals": 0,
- "format": "percentunit",
- "logBase": 1,
- "max": "1.05",
- "min": "0",
- "show": true
- },
- {
- "$$hashKey": "object:958",
- "format": "short",
- "logBase": 1,
- "show": false
- }
- ],
- "yaxis": {
- "align": false
- }
- },
- {
"fieldConfig": {
"defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "decimals": 0,
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
},
- "unit": "dthms"
+ "unit": "bytes"
},
"overrides": []
},
"gridPos": {
- "h": 4,
- "w": 4,
- "x": 6,
- "y": 8
+ "h": 5,
+ "w": 2,
+ "x": 0,
+ "y": 46
},
- "id": 15,
+ "id": 69,
"options": {
- "colorMode": "value",
+ "colorMode": "none",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
- "last"
+ "lastNotNull"
],
"fields": "",
"values": false
},
- "text": {},
- "textMode": "auto"
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "robust_server_uptime{job=\"$Server\"}",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "node_memory_MemTotal_bytes{server=\"$Server\"}",
"interval": "",
"legendFormat": "",
"refId": "A"
}
],
- "title": "Uptime",
+ "title": "Total System Memory",
"type": "stat"
},
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "Basic memory usage",
"fieldConfig": {
"defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "links": [],
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
}
]
},
- "unit": "dthms"
+ "unit": "bytes"
},
- "overrides": []
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Apps"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#629E51",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Buffers"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#614D93",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Cache"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#6D1F62",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Cached"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#511749",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Committed"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#508642",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Free"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#0A437C",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#CFFAFF",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Inactive"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#584477",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "PageTables"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#0A50A1",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Page_Tables"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#0A50A1",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "RAM_Free"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#E0F9D7",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "SWAP Used"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#BF1B00",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Slab"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#806EB7",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Slab_Cache"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#E0752D",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Swap"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#BF1B00",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Swap Used"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#BF1B00",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Swap_Cache"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#C15C17",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Swap_Free"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#2F575E",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Unused"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#EAB839",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "RAM Total"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#E0F9D7",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": false,
+ "mode": "normal"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "RAM Cache + Buffer"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#052B51",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "RAM Free"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#7EB26D",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Avaliable"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#DEDAF7",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": false,
+ "mode": "normal"
+ }
+ }
+ ]
+ }
+ ]
},
"gridPos": {
- "h": 4,
- "w": 4,
- "x": 10,
- "y": 8
+ "h": 5,
+ "w": 10,
+ "x": 2,
+ "y": 46
},
- "id": 16,
+ "id": 78,
"options": {
- "colorMode": "value",
- "graphMode": "none",
- "justifyMode": "auto",
- "orientation": "auto",
- "reduceOptions": {
- "calcs": [
- "last"
- ],
- "fields": "",
- "values": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- "text": {},
- "textMode": "auto"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "8.3.3",
"targets": [
{
- "expr": "robust_server_curtime{job=\"$Server\"}",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "node_memory_MemTotal_bytes{server=\"$Server\"}",
+ "format": "time_series",
+ "hide": false,
"interval": "",
- "legendFormat": "",
- "refId": "A"
- }
- ],
- "title": "CurTime",
- "type": "stat"
- },
- {
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "fieldConfig": {
- "defaults": {
- "links": []
+ "intervalFactor": 2,
+ "legendFormat": "RAM Total",
+ "refId": "A",
+ "step": 240
},
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 4,
- "w": 5,
- "x": 14,
- "y": 8
- },
- "hiddenSeries": false,
- "id": 36,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": false,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
- "options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
{
- "expr": "robust_player_count{job=\"$Server\"}",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "node_memory_MemTotal_bytes{server=\"$Server\"} - node_memory_MemFree_bytes{server=\"$Server\"} - (node_memory_Cached_bytes{server=\"$Server\"} + node_memory_Buffers_bytes{server=\"$Server\"})",
+ "format": "time_series",
+ "hide": false,
"interval": "",
- "legendFormat": "{{job}}",
- "refId": "A"
- }
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "Player Count",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
+ "intervalFactor": 2,
+ "legendFormat": "RAM Used",
+ "refId": "B",
+ "step": 240
+ },
{
- "$$hashKey": "object:145",
- "decimals": 0,
- "format": "short",
- "logBase": 1,
- "min": "0",
- "show": true
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "expr": "node_memory_Cached_bytes{server=\"$Server\"} + node_memory_Buffers_bytes{server=\"$Server\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "RAM Cache + Buffer",
+ "refId": "C",
+ "step": 240
},
{
- "$$hashKey": "object:146",
- "format": "short",
- "logBase": 1,
- "show": false
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "expr": "node_memory_MemFree_bytes{server=\"$Server\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "RAM Free",
+ "refId": "D",
+ "step": 240
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "expr": "(node_memory_SwapTotal_bytes{server=\"$Server\"} - node_memory_SwapFree_bytes{server=\"$Server\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "SWAP Used",
+ "refId": "E",
+ "step": 240
}
],
- "yaxis": {
- "align": false
- }
+ "title": "System Memory",
+ "type": "timeseries"
},
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
"color": {
- "mode": "thresholds"
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
},
+ "links": [],
"mappings": [],
+ "min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -1755,177 +4444,67 @@ Contains the export for our Grafana dashboards at the time of writing. You will
},
"unit": "s"
},
- "overrides": []
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "wizards_den_eu_west"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
},
"gridPos": {
- "h": 8,
- "w": 5,
- "x": 0,
- "y": 12
+ "h": 6,
+ "w": 10,
+ "x": 12,
+ "y": 46
},
- "id": 45,
+ "id": 82,
"options": {
- "displayMode": "gradient",
- "orientation": "horizontal",
- "reduceOptions": {
- "calcs": [
- "lastNotNull"
- ],
- "fields": "",
- "values": false
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- "showUnfilled": true,
- "text": {}
- },
- "pluginVersion": "8.3.2",
- "targets": [
- {
- "expr": "histogram_quantile(0.95, sum(rate(robust_entity_physics_controller_before_solve_bucket{job=\"$Server\"}[5m])) by (le, controller))",
- "interval": "",
- "legendFormat": "{{controller}}",
- "refId": "A"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
}
- ],
- "title": "Controller Tick Breakdown",
- "type": "bargauge"
- },
- {
- "cards": {},
- "color": {
- "cardColor": "#b4ff00",
- "colorScale": "sqrt",
- "colorScheme": "interpolateGreens",
- "exponent": 0.5,
- "mode": "opacity"
- },
- "dataFormat": "tsbuckets",
- "description": "How long gameloop ticks take.",
- "gridPos": {
- "h": 6,
- "w": 7,
- "x": 5,
- "y": 12
- },
- "heatmap": {},
- "hideZeroBuckets": false,
- "highlightCards": true,
- "id": 2,
- "legend": {
- "show": false
},
- "reverseYBuckets": false,
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "rate(robust_game_loop_frametime_bucket{job=\"$Server\"}[10s])",
- "format": "heatmap",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "robust_server_uptime{server=\"$Server\"}",
+ "format": "time_series",
"interval": "",
- "legendFormat": "{{le}}",
+ "legendFormat": "{{server}}",
"refId": "A"
}
],
- "title": "Tick Duration",
- "tooltip": {
- "show": true,
- "showHistogram": false
- },
- "type": "heatmap",
- "xAxis": {
- "show": true
- },
- "yAxis": {
- "decimals": 0,
- "format": "s",
- "logBase": 1,
- "show": true
- },
- "yBucketBound": "auto"
+ "title": "Server Uptime",
+ "type": "timeseries"
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "fieldConfig": {
- "defaults": {
- "links": []
- },
- "overrides": []
- },
- "fill": 1,
- "fillGradient": 0,
- "gridPos": {
- "h": 6,
- "w": 7,
- "x": 12,
- "y": 12
- },
- "hiddenSeries": false,
- "id": 4,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": false,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 2,
- "nullPointMode": "null",
- "options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "rate(robust_server_curtick{job=\"$Server\"}[10s])",
- "interval": "",
- "legendFormat": "",
- "refId": "A"
- }
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "Tickrate",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
},
- "yaxes": [
- {
- "$$hashKey": "object:350",
- "format": "hertz",
- "logBase": 1,
- "show": true
- },
- {
- "$$hashKey": "object:351",
- "format": "short",
- "logBase": 1,
- "show": true
- }
- ],
- "yaxis": {
- "align": false
- }
- },
- {
+ "description": "How often the GC is running, by generation.",
"fieldConfig": {
"defaults": {
"mappings": [],
@@ -1933,676 +4512,561 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
- "value": 0.001
+ "value": 1.5
}
]
},
- "unit": "s"
+ "unit": "none"
},
"overrides": []
},
"gridPos": {
- "h": 8,
- "w": 7,
- "x": 5,
- "y": 18
+ "h": 4,
+ "w": 12,
+ "x": 0,
+ "y": 51
},
- "id": 41,
+ "id": 18,
"options": {
- "displayMode": "gradient",
- "orientation": "horizontal",
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
"reduceOptions": {
"calcs": [
- "mean"
+ "last"
],
"fields": "",
- "values": true
- },
- "showUnfilled": true,
- "text": {}
- },
- "pluginVersion": "8.3.2",
- "targets": [
- {
- "expr": "topk(10, histogram_quantile(0.95, sum(rate(robust_entity_systems_update_usage_bucket{job=\"$Server\"}[5m])) by (le, system)))",
- "format": "time_series",
- "instant": true,
- "interval": "",
- "legendFormat": "{{system}}",
- "refId": "A"
- }
- ],
- "title": "95% System Tick Breakdown",
- "transformations": [],
- "type": "bargauge"
- },
- {
- "aliasColors": {},
- "breakPoint": "50%",
- "combine": {
- "label": "Others",
- "threshold": 0
- },
- "decimals": 0,
- "fontSize": "80%",
- "format": "s",
- "gridPos": {
- "h": 8,
- "w": 7,
- "x": 12,
- "y": 18
- },
- "id": 39,
- "legend": {
- "percentage": true,
- "show": true,
- "sort": "current",
- "sortDesc": true,
- "values": true
- },
- "legendType": "Right side",
- "links": [],
- "nullPointMode": "connected",
- "pieType": "pie",
- "pluginVersion": "7.1.5",
- "strokeWidth": "0.25",
- "targets": [
- {
- "expr": "histogram_quantile(0.95, sum(rate(robust_server_update_usage_bucket[1m])) by (le, area))",
- "interval": "",
- "legendFormat": "{{area}}",
- "refId": "A"
- }
- ],
- "title": "95% Main Tick Timing",
- "type": "grafana-piechart-panel",
- "valueName": "current"
- },
- {
- "aliasColors": {},
- "breakPoint": "50%",
- "combine": {
- "label": "Others",
- "threshold": 0
- },
- "description": "",
- "fontSize": "50%",
- "format": "s",
- "gridPos": {
- "h": 6,
- "w": 5,
- "x": 0,
- "y": 20
+ "values": false
+ },
+ "showPercentChange": false,
+ "text": {},
+ "textMode": "auto",
+ "wideLayout": true
},
- "id": 43,
- "legend": {
- "header": "",
- "show": false,
- "sideWidth": 10,
- "values": true
- },
- "legendType": "On graph",
- "links": [],
- "nullPointMode": "connected",
- "pieType": "pie",
- "pluginVersion": "7.3.2",
- "strokeWidth": "1",
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "topk(10, histogram_quantile(0.95, sum(rate(robust_entity_systems_update_usage_bucket{job=\"$Server\"}[5m])) by (le, system)))",
+ "expr": "rate(dotnet_collection_count_total{server=\"$Server\"}[1m])",
"interval": "",
- "legendFormat": "{{system}}",
- "refId": "A"
+ "legendFormat": "{{generation}}",
+ "refId": "A",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ }
}
],
- "title": "95% System Tick Chart",
- "type": "grafana-piechart-panel",
- "valueName": "current"
- },
- {
- "collapsed": false,
- "gridPos": {
- "h": 1,
- "w": 24,
- "x": 0,
- "y": 26
- },
- "id": 22,
- "panels": [],
- "title": "Network",
- "type": "row"
+ "title": "GC Per Minute",
+ "type": "stat"
},
{
- "aliasColors": {
- "Send": "blue"
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "description": "",
+ "description": "Managed and working set memory",
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "bytes"
},
"overrides": []
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
- "h": 6,
- "w": 7,
+ "h": 5,
+ "w": 6,
"x": 0,
- "y": 27
- },
- "hiddenSeries": false,
- "id": 6,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
+ "y": 55
},
- "lines": true,
- "linewidth": 2,
- "nullPointMode": "null",
+ "id": 9,
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "rate(robust_net_recv_bytes{job=\"$Server\"}[10s])",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "dotnet_total_memory_bytes{server=\"$Server\"}",
"interval": "",
- "legendFormat": "Receive",
+ "legendFormat": "Managed memory",
"refId": "A"
},
{
- "expr": "rate(robust_net_sent_bytes{job=\"$Server\"}[10s])",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "process_working_set_bytes{server=\"$Server\"}-dotnet_total_memory_bytes{server=\"$Server\"}",
+ "hide": false,
"interval": "",
- "legendFormat": "Send",
+ "legendFormat": "Working Set (Extra)",
"refId": "B"
}
],
- "thresholds": [],
- "timeRegions": [],
- "title": "Network Usage",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "$$hashKey": "object:268",
- "decimals": 0,
- "format": "Bps",
- "logBase": 1,
- "min": "0",
- "show": true
- },
- {
- "$$hashKey": "object:269",
- "format": "short",
- "logBase": 1,
- "show": false
- }
- ],
- "yaxis": {
- "align": false
- }
+ "title": "Memory",
+ "type": "timeseries"
},
{
- "aliasColors": {
- "Receive Messages": "dark-red",
- "Receive Packets": "red",
- "Send": "blue",
- "Send Messages": "semi-dark-blue",
- "Send Packets": "blue"
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "description": "* Packets: real UDP packets.\n* Messages: Lidgren messages.\n\nLidgren can combine multiple messages into one UDP packet so these numbers are not necessarily equal. ",
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "short"
},
"overrides": []
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
- "h": 6,
- "w": 7,
- "x": 7,
- "y": 27
- },
- "hiddenSeries": false,
- "id": 7,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
+ "h": 5,
+ "w": 6,
+ "x": 6,
+ "y": 55
},
- "lines": true,
- "linewidth": 2,
- "nullPointMode": "null",
+ "id": 11,
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "rate(robust_net_recv_packets{job=\"$Server\"}[10s])",
- "interval": "",
- "legendFormat": "Receive Packets",
- "refId": "A"
- },
- {
- "expr": "rate(robust_net_sent_packets{job=\"$Server\"}[10s])",
- "interval": "",
- "legendFormat": "Send Packets",
- "refId": "B"
- },
- {
- "expr": "rate(robust_net_sent_messages{job=\"$Server\"}[10s])",
- "interval": "",
- "legendFormat": "Send Messages",
- "refId": "C"
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
},
- {
- "expr": "rate(robust_net_recv_messages{job=\"$Server\"}[10s])",
- "interval": "",
- "legendFormat": "Receive Messages",
- "refId": "D"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
}
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "Packets",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
},
- "yaxes": [
- {
- "$$hashKey": "object:268",
- "decimals": 0,
- "format": "pps",
- "logBase": 1,
- "min": "0",
- "show": true
- },
+ "pluginVersion": "10.4.2",
+ "targets": [
{
- "$$hashKey": "object:269",
- "format": "short",
- "logBase": 1,
- "show": false
+ "expr": "robust_entities_count{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ }
}
],
- "yaxis": {
- "align": false
- }
+ "title": "Game Entity Count",
+ "type": "timeseries"
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "description": "How many messages are currently stored by Lidgren.\n\n* Stored: Reliable messages that are stored in case they need to be re-sent.\n* Unsent: Messages that have not yet been sent because of network overload.",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": true,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "binBps"
},
"overrides": []
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
"h": 5,
"w": 6,
"x": 0,
- "y": 33
- },
- "hiddenSeries": false,
- "id": 28,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
+ "y": 60
},
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
+ "id": 47,
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "robust_net_stored{job=\"$Server\"}",
- "interval": "",
- "legendFormat": "Stored",
- "refId": "A"
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
},
- {
- "expr": "robust_net_unsent{job=\"$Server\"}",
- "interval": "",
- "legendFormat": "Unsent",
- "refId": "B"
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
}
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "Stored Messages",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
},
- "yaxes": [
+ "pluginVersion": "8.3.3",
+ "targets": [
{
- "$$hashKey": "object:134",
- "decimals": 0,
- "format": "none",
- "logBase": 1,
- "min": "0",
- "show": true
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "exemplar": true,
+ "expr": "rate(dotnet_gc_allocated_bytes_total{server=\"$Server\",gc_heap=\"loh\"}[$__rate_interval])",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "Large Object Heap",
+ "range": true,
+ "refId": "B"
},
{
- "$$hashKey": "object:135",
- "format": "short",
- "logBase": 1,
- "show": false
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "exemplar": true,
+ "expr": "rate(dotnet_gc_allocated_bytes_total{server=\"$Server\",gc_heap=\"soh\"}[$__rate_interval])",
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "Small Object Heap",
+ "range": true,
+ "refId": "A"
}
],
- "yaxis": {
- "align": false
- }
+ "title": "Alloc Rate",
+ "type": "timeseries"
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "description": "How many reliable messages are being re-sent by Lidgren.",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "percentunit"
},
"overrides": []
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
"h": 5,
- "w": 6,
+ "w": 3,
"x": 6,
- "y": 33
+ "y": 60
},
- "hiddenSeries": false,
- "id": 30,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": true,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
+ "id": 49,
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "expr": "rate(robust_net_resent_delay{job=\"$Server\"}[10s])",
- "interval": "",
- "legendFormat": "Delay",
- "refId": "A"
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
},
- {
- "expr": "rate(robust_net_resent_hole{job=\"$Server\"}[10s])",
- "interval": "",
- "legendFormat": "Holes",
- "refId": "B"
- }
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "Resent Messages",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
},
- "yaxes": [
- {
- "$$hashKey": "object:614",
- "decimals": 0,
- "format": "short",
- "logBase": 1,
- "min": "0",
- "show": true
- },
+ "pluginVersion": "10.4.2",
+ "targets": [
{
- "$$hashKey": "object:615",
- "format": "short",
- "logBase": 1,
- "show": true
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "dotnet_gc_pause_ratio{server=\"$Server\"}",
+ "interval": "",
+ "legendFormat": "",
+ "refId": "A"
}
],
- "yaxis": {
- "align": false
- }
+ "title": "GC Pause Ratio",
+ "type": "stat"
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "description": "How many messages are getting dropped by Lidgren. This usually indicates duplicates or sequencing issues.",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "s"
},
"overrides": []
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
"h": 5,
- "w": 6,
- "x": 12,
- "y": 33
+ "w": 3,
+ "x": 9,
+ "y": 60
},
- "hiddenSeries": false,
- "id": 32,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": false,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 1,
- "nullPointMode": "null",
+ "id": 51,
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "rate(robust_net_dropped{job=\"$Server\"}[10s])",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "rate(dotnet_gc_pause_seconds_sum{server=\"$Server\"}[1m])",
"interval": "",
"legendFormat": "",
"refId": "A"
}
],
- "thresholds": [],
- "timeRegions": [],
- "title": "Dropped Messages",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "$$hashKey": "object:701",
- "decimals": 0,
- "format": "short",
- "logBase": 1,
- "min": "0",
- "show": true
- },
- {
- "$$hashKey": "object:702",
- "format": "short",
- "logBase": 1,
- "show": false
- }
- ],
- "yaxis": {
- "align": false
- }
+ "title": "GC Pause duration",
+ "type": "stat"
},
{
"collapsed": false,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "fugZSFmMk"
+ },
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
- "y": 38
+ "y": 65
},
- "id": 20,
+ "id": 63,
"panels": [],
- "title": "Memory",
+ "title": "Thread Pool",
"type": "row"
},
{
- "description": "How often the GC is running, by generation.",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
- "value": 1.5
+ "value": 80
}
]
- },
- "unit": "none"
+ }
},
"overrides": []
},
"gridPos": {
"h": 5,
- "w": 14,
+ "w": 3,
"x": 0,
- "y": 39
+ "y": 66
},
- "id": 18,
+ "id": 59,
"options": {
"colorMode": "value",
"graphMode": "area",
@@ -2610,212 +5074,363 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"orientation": "auto",
"reduceOptions": {
"calcs": [
- "last"
+ "lastNotNull"
],
"fields": "",
"values": false
},
- "text": {},
- "textMode": "auto"
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
},
- "pluginVersion": "8.3.2",
+ "pluginVersion": "10.4.2",
"targets": [
{
- "expr": "rate(dotnet_collection_count_total{job=\"$Server\"}[1m])",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "exemplar": true,
+ "expr": "dotnet_threadpool_num_threads{server=\"$Server\"}",
"interval": "",
- "legendFormat": "{{generation}}",
+ "legendFormat": "",
"refId": "A"
}
],
- "title": "GC Per Minute",
+ "title": "Thread Pool Thread Count",
"type": "stat"
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
- "description": "Managed and working set memory",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
- "links": []
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 15,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
},
"overrides": []
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
"h": 5,
- "w": 6,
- "x": 0,
- "y": 44
+ "w": 5,
+ "x": 3,
+ "y": 66
},
- "hiddenSeries": false,
- "id": 9,
- "legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": false,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 2,
- "nullPointMode": "null",
+ "id": 65,
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": true,
- "steppedLine": false,
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
"targets": [
{
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
"exemplar": true,
- "expr": "dotnet_total_memory_bytes{job=\"$Server\"}",
+ "expr": "rate(dotnet_threadpool_throughput_total{server=\"$Server\"}[$__rate_interval])",
"interval": "",
- "legendFormat": "Managed memory",
+ "legendFormat": "",
+ "range": true,
"refId": "A"
- },
- {
- "exemplar": true,
- "expr": "process_working_set_bytes{job=\"$Server\"}-dotnet_total_memory_bytes{job=\"$Server\"}",
- "hide": false,
- "interval": "",
- "legendFormat": "Working Set (Extra)",
- "refId": "B"
- }
- ],
- "thresholds": [],
- "timeRegions": [],
- "title": "Memory",
- "tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
- "show": true,
- "values": []
- },
- "yaxes": [
- {
- "$$hashKey": "object:449",
- "format": "bytes",
- "logBase": 1,
- "min": "0",
- "show": true
- },
- {
- "$$hashKey": "object:450",
- "format": "short",
- "logBase": 1,
- "show": false
}
],
- "yaxis": {
- "align": false
- }
+ "title": "Thread Pool Item Rate",
+ "type": "timeseries"
},
{
- "aliasColors": {},
- "bars": false,
- "dashLength": 10,
- "dashes": false,
+ "cards": {},
+ "color": {
+ "cardColor": "#73BF69",
+ "colorScale": "linear",
+ "colorScheme": "interpolateGreens",
+ "exponent": 0.5,
+ "mode": "opacity"
+ },
+ "dataFormat": "tsbuckets",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
"fieldConfig": {
"defaults": {
- "links": []
+ "custom": {
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "scaleDistribution": {
+ "type": "linear"
+ }
+ }
},
"overrides": []
},
- "fill": 1,
- "fillGradient": 0,
"gridPos": {
"h": 5,
- "w": 6,
- "x": 6,
- "y": 44
+ "w": 5,
+ "x": 8,
+ "y": 66
},
- "hiddenSeries": false,
- "id": 11,
+ "heatmap": {},
+ "hideZeroBuckets": false,
+ "highlightCards": true,
+ "id": 67,
"legend": {
- "avg": false,
- "current": false,
- "max": false,
- "min": false,
- "show": false,
- "total": false,
- "values": false
- },
- "lines": true,
- "linewidth": 2,
- "nullPointMode": "null",
+ "show": false
+ },
"options": {
- "alertThreshold": true
- },
- "percentage": false,
- "pluginVersion": "8.3.2",
- "pointradius": 2,
- "points": false,
- "renderer": "flot",
- "seriesOverrides": [],
- "spaceLength": 10,
- "stack": false,
- "steppedLine": false,
+ "calculate": false,
+ "calculation": {},
+ "cellGap": 2,
+ "cellValues": {},
+ "color": {
+ "exponent": 0.5,
+ "fill": "#73BF69",
+ "mode": "opacity",
+ "reverse": false,
+ "scale": "exponential",
+ "scheme": "Oranges",
+ "steps": 128
+ },
+ "exemplars": {
+ "color": "rgba(255,0,255,0.7)"
+ },
+ "filterValues": {
+ "le": 1e-9
+ },
+ "legend": {
+ "show": false
+ },
+ "rowsFrame": {
+ "layout": "auto"
+ },
+ "showValue": "never",
+ "tooltip": {
+ "mode": "single",
+ "showColorScale": false,
+ "yHistogram": false
+ },
+ "yAxis": {
+ "axisPlacement": "left",
+ "reverse": false,
+ "unit": "short"
+ }
+ },
+ "pluginVersion": "10.4.2",
+ "reverseYBuckets": false,
"targets": [
{
- "expr": "robust_entities_count{job=\"$Server\"}",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "exemplar": true,
+ "expr": "rate(dotnet_threadpool_queue_length_bucket{server=\"$Server\"}[$__rate_interval])",
+ "format": "heatmap",
"interval": "",
- "legendFormat": "",
+ "legendFormat": "{{le}}",
+ "range": true,
"refId": "A"
}
],
- "thresholds": [],
- "timeRegions": [],
- "title": "Game Entity Count",
+ "title": "Thread Pool Queue",
"tooltip": {
- "shared": true,
- "sort": 0,
- "value_type": "individual"
- },
- "type": "graph",
- "xaxis": {
- "mode": "time",
"show": true,
- "values": []
+ "showHistogram": false
+ },
+ "type": "heatmap",
+ "xAxis": {
+ "show": true
+ },
+ "yAxis": {
+ "format": "short",
+ "logBase": 1,
+ "show": true
+ },
+ "yBucketBound": "auto"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 71
+ },
+ "id": 88,
+ "panels": [],
+ "title": "Database",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 12,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "ops"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 72
+ },
+ "id": 90,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
},
- "yaxes": [
+ "targets": [
{
- "$$hashKey": "object:678",
- "format": "short",
- "logBase": 1,
- "min": "0",
- "show": true
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(db_write_ops{server=\"$Server\"}[$__rate_interval])",
+ "legendFormat": "Write",
+ "range": true,
+ "refId": "A"
},
{
- "$$hashKey": "object:679",
- "format": "short",
- "logBase": 1,
- "show": true
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "rate(db_read_ops{server=\"$Server\"}[$__rate_interval])",
+ "hide": false,
+ "legendFormat": "Read",
+ "range": true,
+ "refId": "B"
}
],
- "yaxis": {
- "align": false
- }
+ "title": "Database Operations",
+ "type": "timeseries"
}
],
- "refresh": false,
- "schemaVersion": 33,
- "style": "dark",
+ "refresh": "",
+ "schemaVersion": 39,
"tags": [
"game servers"
],
@@ -2823,9 +5438,9 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"list": [
{
"current": {
- "selected": true,
- "text": "wizards_den_eu_west",
- "value": "wizards_den_eu_west"
+ "selected": false,
+ "text": "wizards_den_lizard",
+ "value": "wizards_den_lizard"
},
"hide": 0,
"includeAll": false,
@@ -2833,20 +5448,15 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"name": "Server",
"options": [
{
- "selected": true,
+ "selected": false,
"text": "wizards_den_eu_west",
"value": "wizards_den_eu_west"
},
{
- "selected": false,
+ "selected": true,
"text": "wizards_den_lizard",
"value": "wizards_den_lizard"
},
- {
- "selected": false,
- "text": "raspberry",
- "value": "raspberry"
- },
{
"selected": false,
"text": "wizards_den_eu_west_2",
@@ -2856,9 +5466,24 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"selected": false,
"text": "wizards_den_centipede",
"value": "wizards_den_centipede"
+ },
+ {
+ "selected": false,
+ "text": "leviathan",
+ "value": "leviathan"
+ },
+ {
+ "selected": false,
+ "text": "salamander",
+ "value": "salamander"
+ },
+ {
+ "selected": false,
+ "text": "vulture",
+ "value": "vulture"
}
],
- "query": "wizards_den_eu_west, wizards_den_lizard, raspberry, wizards_den_eu_west_2, wizards_den_centipede",
+ "query": "wizards_den_eu_west, wizards_den_lizard, wizards_den_eu_west_2, wizards_den_centipede, leviathan, salamander, vulture",
"queryValue": "",
"skipUrlSync": false,
"type": "custom"
@@ -2885,7 +5510,7 @@ Contains the export for our Grafana dashboards at the time of writing. You will
"timezone": "",
"title": "Perf Metrics",
"uid": "qyFqpFiGk",
- "version": 44,
+ "version": 68,
"weekStart": ""
}
```
\ No newline at end of file
diff --git a/src/en/community/maintainer.md b/src/en/community/maintainer.md
new file mode 100644
index 000000000..ad40646de
--- /dev/null
+++ b/src/en/community/maintainer.md
@@ -0,0 +1,3 @@
+# Maintainer
+
+This section contains information on Maintaier and PR-Review Policies, **as it pertains to Wizards Den servers, hosted by Space Wizards.** These policies do not apply to other servers, and may be waived in exceptional circumstances.
\ No newline at end of file
diff --git a/src/en/community/maintainer/wizards-den-maintainer-policy.md b/src/en/community/maintainer/wizards-den-maintainer-policy.md
new file mode 100644
index 000000000..2d68c8c98
--- /dev/null
+++ b/src/en/community/maintainer/wizards-den-maintainer-policy.md
@@ -0,0 +1,5 @@
+# Wizards Den Maintainer Policy
+
+```admonish warning "Work in Progress"
+This page is a work in progress! Maintainer policy will be posted when they are ready.
+```
\ No newline at end of file
diff --git a/src/en/community/maintainer/wizards-den-review-policy.md b/src/en/community/maintainer/wizards-den-review-policy.md
new file mode 100644
index 000000000..16e8c3dc1
--- /dev/null
+++ b/src/en/community/maintainer/wizards-den-review-policy.md
@@ -0,0 +1,5 @@
+# Wizards Den Review Policy
+
+```admonish warning "Work in Progress"
+This page is a work in progress! Review policy will be posted when they are ready.
+```
\ No newline at end of file
diff --git a/src/en/community/projectmanager.md b/src/en/community/projectmanager.md
new file mode 100644
index 000000000..3cfaf04d5
--- /dev/null
+++ b/src/en/community/projectmanager.md
@@ -0,0 +1,38 @@
+# Project Managers
+
+## What are Project Managers (or PMs)?
+
+Project Managers handle a variety of responsibilities when it comes to the SS14 game and community. If there is policy or a high-level decision being made, the project management team will be involved. PM is less of a defined role and more of a higher responsibility with different PMs handling different elements of the game and community. In general if a situation needs escalating then short of involving a Wizard, PMs are where the buck stops so to speak.
+
+The PM team does not appeal bans or get involved in individual player/game disputes unless said dispute is creating an issue of safety or harassment (However some PMs are also game admins and may act in this capacity). The admin team should be your first point of contact for these sorts of issues, with PM's being the nuclear option in an emergency situation where you have fears for your, or another community memeber's safety.
+
+## Areas of Responsibility
+
+All Project Managers have the same level of authority and autonomy when it comes to addressing issues, however some PMs prefer to or are more experienced in handling particular issues. In an emergency any PM will be able to help you, but generally a PM with the appropriate area will be able to address your issue faster and more accurately. *Although, if you message the wrong PM don't worry we all talk with each other so they'll be able to help you or forward you along to someone who can, it's just faster to start with a PM from that area!*
+
+Here is a list of PM's and their responsiblities. Some responsibilities such as Hub Administration and Sensitive Issue handling are not listed publicly to prevent targeted harassment.
+This page may sometimes be out of date, for the most recent responsibilities check discord (If this page is out of date ping @Jezithyr on discord or let a maintainer know).
+
+| Responsibility | Description | Members |
+|---|---|---|
+| Wizards | Highest level of staff in SS14. They are responsibly for handling business-to-business, fincanical, and legal matters. If you think you need to ping a wizard you don't, just talk to a PM instead. | PJB, Zoldorf, Bobda, DrSmugleaf |
+| Project Lead | The GOAT. The supreme nerd overlord. Also someone who is very busy and unless you need help with something very niche and specific, you're better off asking another PM/Maintainer. | PJB |
+| PM Team Lead | The ~~Queen~~ benevolent leader of the PM team. She manages internal disputes and helps the PM team stay on track! | DrSmugleaf |
+| Head Admins | The triumverate in-charge of the admin team. These are the people who *write the rules/policy for the admins* not the people to ask to appeal your ban. | Skarlet, Nairod, Chief_Engineer |
+| Infrastructure | Anything related to the infra running wizden servers andHub/Robust accounts. Outages, connection problems, etc. | Zoldorf, PJB, ShadowCommander, Jezithyr, DrSmugleaf, Chief_Engineer |
+| Project Tech Direction | Technical direction when it comes to code/systems in SS14 and RobustToolbox. Specifically code quality/performance and implementation specifics. | PJB, ElectroSR, ShadowCommander, Jezithyr, DrSmugleaf, Keronshb, Sloth |
+| Project Maintenance | Overseeing the maintainer team and making sure that project guidelines are being properly enforced in PRs, along with helping to manage the number of open PRs | PJB, ElectroSR, ShadowCommander, Jezithyr, DrSmugleaf, Keronshb, Sloth |
+| Engine Development | Works on developing Robust Toolbox | PJB, ElectroSR, ShadowCommander, Jezithyr, DrSmugleaf, Keronshb, Sloth |
+| Content Development | Works on developing Content/Code for SS14 (Specifically WizardsDen servers/upstream) | PJB, ElectroSR, ShadowCommander, Jezithyr, DrSmugleaf, Keronshb, Sloth, Nairod |
+| Documentation | Overseeing the documentation repo and making sure that it is being kept up to date. Primarily focused on the non-ss14 sections of the docs but also holding the maintainer work groups accountable for updating their sections. | ShadowCommander, Jezithyr, DrSmugleaf, Keronshb |
+| Policy | Writes and maintains Wizden/Project-wide policy, such as the hub or general staff policies. | Jezithyr, DrSmugleaf, Sloth, Chief_Engineer, Nairod |
+| Biz Dev | Handles anything related to business-level communication/planning in relation to Space Wizards Federation and SS14. This also includes acting as a point of contact for business entities or journalists. | PJB, Zoldorf, Jezithyr, DrSmugleaf |
+| Game Administration | Handles higher level game administration matters while working with the admin team. May also perform game administration on live severs. | PJB, Emisse, Jezithyr, DrSmugleaf, Skarlet, Chief_Engineer, Nairod |
+| General Administration | Handles general community administration matters such as the forums, discord, or github. | PJB, ShadowCommander, Jezithyr, DrSmugleaf, Skarlet, Chief_Engineer, Nairod, Retequizzle, MushroomLavender |
+| Community Outreach | Handles communication and interaction with the general SS14 community. | Emisse, ElectroSR, ShadowCommander, Jezithyr, Nairod, Retequizzle, MushroomLavender |
+
+
+
+
+
+
diff --git a/src/en/community/space-wizards-maintainer-list.md b/src/en/community/space-wizards-maintainer-list.md
new file mode 100644
index 000000000..e0d169be7
--- /dev/null
+++ b/src/en/community/space-wizards-maintainer-list.md
@@ -0,0 +1,42 @@
+# Space Wizard Maintainer List
+This document shows all current Maintainers on the project. Along with their GitHub and Discord contacts.
+
+I will do my best to keep this up to date as Maintainers come and leave.
+
+The format is as follows
+
+**Github - Discord (ID)**
+
+Both Engine and Content Maintainers:
+- [Jezithyr](https://github.com/Jezithyr) - @jezithyr (107689319396831232)
+- [ZoldorfTheWizard](https://github.com/ZoldorfTheWizard) - @zoldorf (140921734109855744)
+- [PJB3005](https://github.com/PJB3005) - @pjb (97089048065097728)
+- [ShadowCommander](https://github.com/ShadowCommander) - @shadowcommander (104693014407950336)
+- [DrSmugleaf](https://github.com/DrSmugleaf) - @drsmugleaf (109067752286715904)
+- [mirrorcult](https://github.com/mirrorcult) - @mirrorcult (176065747200507904)
+- [metalgearsloth](https://github.com/metalgearsloth) - @metalgearsloth (229052932476108800)
+- [Visne](https://github.com/Visne) - @visne (182723474257608705)
+- [keronshb](https://github.com/keronshb) - @keronshb (226429200553213952)
+- [AJCM-git](https://github.com/AJCM-git) - @ajcm_git (239467362380808192)
+- [ElectroJr](https://github.com/ElectroJr) - @electrosr (348118974497816577)
+- [vulppine](https://github.com/vulppine) - @vulppine (102244617314914304)
+
+Content Maintainers:
+- [Partmedia](https://github.com/Partmedia) - @notafet (774744999379599360)
+- [Emisse](https://github.com/Emisse) - @emisse (109430489684705280)
+- [Chief-Engineer](https://github.com/Chief-Engineer) - @am.ghost (267392122179682307)
+- [juliangiebel](https://github.com/juliangiebel) - @julian_g (234313113766199297)
+- [Tayrtahn](https://github.com/Tayrtahn) - @tayrtahn (147050540214386689)
+- [deathride58](https://github.com/deathride58) - @bhijn (77867936647225344)
+- [VasilisThePikachu](https://github.com/VasilisThePikachu) - @vasilisiscool (322708417540259841)
+- [Slava0135](https://github.com/Slava0135) - @slava0135 (439814569972727818)
+- [ficcialfaint](https://github.com/ficcialfaint) - @ficcialfaint (481532274211422209)
+- [chromiumboy](https://github.com/chromiumboy) - @chromiumboy (395222876753625088)
+- [TemporalOroboros](https://github.com/TemporalOroboros) - @the_quiet_one (423542163503185942)
+- [Flareguy](https://github.com/Flareguy) - @flar3guy (310216766192091156)
+- [TheShuEd](https://github.com/TheShuEd) - @eshhhed (267327466060775425)
+- [EmoGarbage404](https://github.com/EmoGarbage404) - @emogarbage (500128901805244436)
+- [LankLTE](https://github.com/LankLTE) - @lanklte (328292818265047041)
+
+Engine maintainers:
+No one maintains only engine :p
diff --git a/src/en/general-development/codebase-info/pull-request-guidelines.md b/src/en/general-development/codebase-info/pull-request-guidelines.md
index dca4b9c23..adfcc46df 100644
--- a/src/en/general-development/codebase-info/pull-request-guidelines.md
+++ b/src/en/general-development/codebase-info/pull-request-guidelines.md
@@ -79,7 +79,7 @@ The Github PR template contains the following changelog that you can use to form
By default, changes are credited to your Github username. If you would like your name to appear differently in-game, add a string on the same line as the `:cl:` with the name that you would like to use.
-Each entry is either an `add`, `remove`, `tweak`, or `fix`. There can be multiple entires in each category. These set the change log icon and do not show up in the change log text.
+Each entry is either an `add`, `remove`, `tweak`, or `fix`. There can be multiple entries in each category. These set the change log icon and do not show up in the change log text.
Maintainers may, at their discretion, add, modify, or remove a change log entry that you suggest.
diff --git a/src/en/general-development/contributing-translations.md b/src/en/general-development/contributing-translations.md
new file mode 100644
index 000000000..3950f65ac
--- /dev/null
+++ b/src/en/general-development/contributing-translations.md
@@ -0,0 +1,19 @@
+# Contributing Translations
+
+```admonish info
+The main game **cannot** be translated for now. While the game itself does support localization as well, we currently do not want to accept upstream translations as they cannot actually be used by players on official servers.
+```
+
+Translating the game to other languages is relatively easy! No programming knowledge or special software is required, just an understanding of English and whatever language you're translating to.
+
+## Getting Started
+
+Translation of the game is handled via [Weblate](https://weblate.spacestation14.com/). This program provides an easy interface for translators to submit translations. To get started, you can simply sign in with your existing Space Station 14 account.
+
+As a new user, you only have the ability to submit suggestions. These need to be reviewed by another translator before being accepted. If you want to get full translator permissions (ability to direct save translations yourself), **just ask** in Discord or on the Forum, there's no high barrier of entry here. Same thing if you submit suggestions and they don't get approved by an existing translator a week later.
+
+If the language you want to translate to doesn't exist yet, also **just ask**. It requires a bit of manual work to set everything up for a new language.
+
+## Working Together
+
+Translation requires teamwork and coordination. If you wanna talk about translation stuff, the best place to do it is the `#translation` channel on our [Discord](https://discord.ss14.io).
\ No newline at end of file
diff --git a/src/en/general-development/feature-proposals.md b/src/en/general-development/feature-proposals.md
index be571831e..8cb7346d1 100644
--- a/src/en/general-development/feature-proposals.md
+++ b/src/en/general-development/feature-proposals.md
@@ -4,7 +4,7 @@ If you are considering adding or reworking some major component of the game it's
## How do I make a proposal?
-1. Make a copy of the design proposal template located at `src/en/proposals/proposal-template.md`.
+1. Make a copy of the design proposal template located at `src/en/templates/proposal.md`.
3. Read through [SS14's Core Design Documentation](../space-station-14/core-design.md) (for gameplay-related proposals).
@@ -46,7 +46,7 @@ A good rule of thumb if the new feature or rework you have in mind would require
No idea! What design proposals do or do not get in is determined by maintainer approval like normal PRs. If you can get at least one maint to decide that it sounds like a good idea then there's a good chance that it will get accepted. Pretty much any idea is going to need at least some critiquing before it gets merged so don't get discouraged!
``` admonish tip "Design Principles"
-If you want to improve your chances, it's recommended that you read the [SS14 Core Design Documentation](/src/en/space-station-14/core-design.md) document to get a high-level overview before you start writing, as it'll provide context for why things are the way they are.
+If you want to improve your chances, it's recommended that you read the [SS14 Core Design Documentation](/src/en/space-station-14/design.md) document to get a high-level overview before you start writing, as it'll provide context for why things are the way they are.
PR'd design documents should also follow the [Decorum Guidelines](./feature-proposals/expected-feature-proposal-decorum.md).
```
diff --git a/src/en/general-development/setup/git-for-the-ss14-developer.md b/src/en/general-development/setup/git-for-the-ss14-developer.md
index bfd4d72e0..49e47db07 100644
--- a/src/en/general-development/setup/git-for-the-ss14-developer.md
+++ b/src/en/general-development/setup/git-for-the-ss14-developer.md
@@ -128,6 +128,11 @@ Then, we'll enter the command for cloning **our** remote repository--not the `sp
![](https://i.imgur.com/Xn4AQLf.png)
+Then **c**hange **d**irectory using:
+``cd space-station-14``
+
+(This may be diffrent if you cloned another fork, it's almost always being the same as the repository name)
+
Every Git command will look something like this--`git` and then a keyword like `add`, `commit`, `pull`, etc.