summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2018-01-29 18:46:12 +0100
committerschneefux <schneefux+commit@schneefux.xyz>2018-01-29 18:46:12 +0100
commitd03a60cf0c2229dee543d30028938d4b0f878b4f (patch)
tree88750962f7e2e03fd41a059fdbd8ca587dbf5831
parent6b71325f7af1c331988e9e7e60852d63e961c891 (diff)
parent692ec19fd8d78c0c7cd3da7df26452069f8c5578 (diff)
downloadshrinker-master.tar.gz
shrinker-master.zip
Merge branch 'develop'HEADrelease/2.23.0master
-rw-r--r--package-lock.json5
-rw-r--r--package.json1
-rw-r--r--worker.js516
3 files changed, 26 insertions, 496 deletions
diff --git a/package-lock.json b/package-lock.json
index c7b494f..0a6f146 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -825,6 +825,11 @@
"stack-trace": "0.0.10"
}
},
+ "winston-datadog": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/winston-datadog/-/winston-datadog-1.1.0.tgz",
+ "integrity": "sha512-f3r1dsqXrK9o5nBRKFWaROf5QkoqJHGY6k0RMuwm4L+Oaab0JnQPGPkVxvJi9E1ylffGOrGFF/d9YCv2IP+IVg=="
+ },
"winston-loggly-bulk": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/winston-loggly-bulk/-/winston-loggly-bulk-2.0.0.tgz",
diff --git a/package.json b/package.json
index 43e460f..c79752a 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"mysql2": "^1.4.0",
"sequelize": "^4.4.2",
"winston": "^2.3.1",
+ "winston-datadog": "^1.1.0",
"winston-loggly-bulk": "^2.0.0"
},
"devDependencies": {},
diff --git a/worker.js b/worker.js
index d142bc1..a8f9c00 100644
--- a/worker.js
+++ b/worker.js
@@ -8,6 +8,7 @@ const amqp = require("amqplib"),
Promise = require("bluebird"),
winston = require("winston"),
loggly = require("winston-loggly-bulk"),
+ datadog = require("winston-datadog"),
Seq = require("sequelize"),
cacheManager = require("cache-manager"),
api_name_mappings = require("../orm/mappings").map,
@@ -18,6 +19,7 @@ const RABBITMQ_URI = process.env.RABBITMQ_URI,
DATABASE_URI = process.env.DATABASE_URI,
QUEUE = process.env.QUEUE || "shrink",
LOGGLY_TOKEN = process.env.LOGGLY_TOKEN,
+ DATADOG_TOKEN = process.env.DATADOG_TOKEN,
// matches + players, 5 players with 50 matches as default
BATCHSIZE = parseInt(process.env.BATCHSIZE) || 20,
// maximum number of elements to be inserted in one statement
@@ -50,6 +52,12 @@ if (LOGGLY_TOKEN)
json: true
});
+// datadog integration
+if (DATADOG_TOKEN)
+ logger.add(new datadog({
+ api_key: DATADOG_TOKEN
+ }), null, true);
+
// split an array into arrays of max chunksize
function* chunks(arr) {
for (let c=0, len=arr.length; c<len; c+=CHUNKSIZE)
@@ -325,441 +333,30 @@ amqp.connect(RABBITMQ_URI).then(async (rabbit) => {
participant_api_id: p.api_id,
match_api_id: telemetry.match_api_id,
- kills: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "KillActor"
- && ev.payload.IsHero == 1
- && ev.payload.TargetIsHero == 1
- ).length,
- deaths: telemetry.data.filter((ev) =>
- ev.target == p
- && ev.type == "KillActor"
- && ev.payload.TargetIsHero == 1
- ).length,
- // assists missing in data
- minion_kills: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "KillActor"
- && ["*JungleMinion_TreeEnt*",
- "*Neutral_JungleMinion_DefaultBig*",
- "*Neutral_JungleMinion_DefaultSmall*",
- "*LeadMinion*",
- "*RangedMinion*",
- "*TankMinion*"
- ].indexOf(ev.payload.Killed) != -1
- ).length,
- jungle_kills: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "KillActor"
- && ["*JungleMinion_TreeEnt*",
- "*Neutral_JungleMinion_DefaultBig*",
- "*Neutral_JungleMinion_DefaultSmall*"
- ].indexOf(ev.payload.Killed) != -1
- ).length,
- non_jungle_minion_kills: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "KillActor"
- && ["*LeadMinion*",
- "*RangedMinion*",
- "*TankMinion*"
- ].indexOf(ev.payload.Killed) != -1
- ).length,
- crystal_mine_captures: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "KillActor"
- && ev.payload.Killed == "*JungleMinion_CrystalMiner*"
- ).length,
- gold_mine_captures: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "KillActor"
- && ev.payload.Killed == "*JungleMinion_GoldMiner*"
- || ev.payload.Killed == "*JungleMinion_Blitz_MiddleSentry*"
- ).length,
- kraken_captures: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "KillActor"
- && ev.payload.Killed == "*Kraken_Jungle*"
- ).length,
- turret_captures: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "KillActor"
- && (ev.payload.Killed == "*Turret*"
- || ev.payload.Killed == "*VainTurret*")
- ).length,
- // TODO Telemetry does not give accurate LifetimeGold
- gold: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "LevelUp"
- && ev.payload.LifetimeGold > acc
- ? ev.payload.LifetimeGold
- : acc
- , null),
- dmg_true_hero: telemetry.data.reduce((acc, ev) =>
+ dmg_true: telemetry.data.reduce((acc, ev) =>
ev.actor == p
&& ev.type == "DealDamage"
- && ev.payload.TargetIsHero == 1
? acc + ev.payload.Damage
: acc
, 0),
- dmg_true_kraken: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ["*Kraken_Jungle*",
- "*Kraken_Captured*"
- ].indexOf(ev.payload.Target) != -1
- ? acc + ev.payload.Damage
- : acc
- , 0),
- dmg_true_turret: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.Target == "*Turret*"
- ? acc + ev.payload.Damage
- : acc
- , 0),
- dmg_true_vain_turret: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.Target == "*VainTurret*"
- ? acc + ev.payload.Damage
- : acc
- , 0),
- dmg_true_others: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.TargetIsHero == 0
- ? acc + ev.payload.Damage
- : acc
- , 0),
- dmg_dealt_hero: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.TargetIsHero == 1
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- dmg_dealt_kraken: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ["*Kraken_Jungle*",
- "*Kraken_Captured*"
- ].indexOf(ev.payload.Target) != -1
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- dmg_dealt_turret: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.Target == "*Turret*"
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- dmg_dealt_vain_turret: telemetry.data.reduce((acc, ev) =>
+ dmg_dealt: telemetry.data.reduce((acc, ev) =>
ev.actor == p
&& ev.type == "DealDamage"
- && ev.payload.Target == "*VainTurret*"
? acc + ev.payload.Dealt
: acc
, 0),
- dmg_dealt_others: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.TargetIsHero == 0
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- dmg_rcvd_dealt_hero: telemetry.data.reduce((acc, ev) =>
- ev.target == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- dmg_rcvd_true_hero: telemetry.data.reduce((acc, ev) =>
- ev.target == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- ? acc + ev.payload.Damage
- : acc
- , 0),
- dmg_rcvd_dealt_others: telemetry.data.reduce((acc, ev) =>
+ dmg_rcvd_dealt: telemetry.data.reduce((acc, ev) =>
ev.target == p
&& ev.type == "DealDamage"
- && ev.payload.IsHero == 0
? acc + ev.payload.Dealt
: acc
, 0),
- dmg_rcvd_true_others: telemetry.data.reduce((acc, ev) =>
+ dmg_rcvd_true: telemetry.data.reduce((acc, ev) =>
ev.target == p
&& ev.type == "DealDamage"
- && ev.payload.IsHero == 0
? acc + ev.payload.Damage
: acc
, 0),
- // max level of A
- ability_a_level: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "LearnAbility"
- && crashIfBullshit(ev.payload.Ability)
- && api_name_mappings.get(ev.payload.Ability)
- .split(" ")[1] == "A"
- ).reduce((acc, ev) =>
- ev.payload.Level > acc
- ? ev.payload.Level
- : acc
- , 0),
- // max level of B
- ability_b_level: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "LearnAbility"
- && crashIfBullshit(ev.payload.Ability)
- && api_name_mappings.get(ev.payload.Ability)
- .split(" ")[1] == "B"
- ).reduce((acc, ev) =>
- ev.payload.Level > acc
- ? ev.payload.Level
- : acc
- , 0),
- // max level of C
- ability_c_level: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "LearnAbility"
- && crashIfBullshit(ev.payload.Ability)
- && api_name_mappings.get(ev.payload.Ability)
- .split(" ")[1] == "C"
- ).reduce((acc, ev) =>
- ev.payload.Level > acc
- ? ev.payload.Level
- : acc
- , 0),
- hero_level: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "LevelUp"
- && ev.payload.Level > acc
- ? ev.payload.Level
- : acc
- , -1),
- items: null, // TODO
- // { array index: item id }
- item_grants_inorder: dynamicColumn([].concat(...telemetry.data
- .filter((ev) => ev.actor == p && ev.type == "BuyItem")
- .map((ev, idx) => {
- crashIfBullshit(ev.payload.Item);
- const item = item_db_map.get(
- api_name_mappings.get(ev.payload.Item)
- );
- return [idx, item];
- })
- )),
- // TODO rm some duplicated code here
- // { item id: count }
- item_grants: dynamicColumn([].concat(...
- (() => {
- // TODO refactor this
- const items = new Map();
- // key, value, key, value, …
- telemetry.data.forEach((ev) => {
- if (ev.actor == p && ev.type == "BuyItem") {
- crashIfBullshit(ev.payload.Item);
- const item = item_db_map.get(
- api_name_mappings.get(ev.payload.Item)
- );
- if (!items.has(item)) items.set(item, 0);
- items.set(item, items.get(item)+1);
- }
- });
- return [...items.entries()];
- })()
- )),
- item_sells: dynamicColumn([].concat(...
- (() => {
- const items = new Map();
- // key, value, key, value, …
- telemetry.data.forEach((ev) => {
- if (ev.actor == p && ev.type == "SellItem") {
- crashIfBullshit(ev.payload.Item);
- const item = item_db_map.get(
- api_name_mappings.get(ev.payload.Item));
- if (!items.has(item)) {
- items.set(item, 0);
- }
- items.set(item, items.get(item)+1);
- }
- });
- return [...items.entries()];
- })()
- )),
- ability_a_use: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "UseAbility"
- && crashIfBullshit(ev.payload.Ability)
- && api_name_mappings.get(ev.payload.Ability)
- .split(" ")[1] == "A"
- ).length,
- ability_b_use: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "UseAbility"
- && crashIfBullshit(ev.payload.Ability)
- && api_name_mappings.get(ev.payload.Ability)
- .split(" ")[1] == "B"
- ).length,
- ability_c_use: telemetry.data.filter((ev) =>
- ev.actor == p
- && ev.type == "UseAbility"
- && crashIfBullshit(ev.payload.Ability)
- && api_name_mappings.get(ev.payload.Ability)
- .split(" ")[1] == "C"
- ).length,
- ability_a_damage_true: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "A"
- ? acc + ev.payload.Damage
- : acc
- , 0),
- ability_a_damage_dealt: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "A"
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- ability_b_damage_true: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "B"
- ? acc + ev.payload.Damage
- : acc
- , 0),
- ability_b_damage_dealt: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "B"
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- ability_c_damage_true: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "C"
- ? acc + ev.payload.Damage
- : acc
- , 0),
- ability_c_damage_dealt: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "C"
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- ability_perk_damage_true: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "perk"
- ? acc + ev.payload.Damage
- : acc
- , 0),
- ability_perk_damage_dealt: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "perk"
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- ability_aa_damage_true: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "AA"
- ? acc + ev.payload.Damage
- : acc
- , 0),
- ability_aa_damage_dealt: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "AA"
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- ability_aacrit_damage_true: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "AAcrit"
- ? acc + ev.payload.Damage
- : acc
- , 0),
- ability_aacrit_damage_dealt: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "DealDamage"
- && ev.payload.IsHero == 1
- && crashIfBullshit(ev.payload.Source)
- && isAbility(ev.payload.Source)
- && api_name_mappings.get(ev.payload.Source)
- .split(" ")[1] == "AAcrit"
- ? acc + ev.payload.Dealt
- : acc
- , 0),
- item_uses: dynamicColumn([].concat(...
- (() => {
- const items = new Map();
- // key, value, key, value, …
- telemetry.data.forEach((ev) => {
- if (ev.actor == p && ev.type == "UseItemAbility") {
- crashIfBullshit(ev.payload.Ability);
- const item = item_db_map.get(
- api_name_mappings.get(ev.payload.Ability)
- );
- if (!items.has(item)) items.set(item, 0);
- items.set(item, items.get(item)+1);
- }
- });
- return [...items.entries()];
- })()
- )),
- player_damage: null, // TODO
draft_position: telemetry.data.filter((ev) =>
ev.type == "HeroSelect").indexOf(
telemetry.data.filter((ev) =>
@@ -777,118 +374,45 @@ amqp.connect(RABBITMQ_URI).then(async (rabbit) => {
ev.type == "HeroSelect"
&& ev.actor == p)
.map((sel) => sel.payload.Hero)[0] // can be null
- )),// traits calculated later
+ )),
// since 2.9
- // theoretical heal from actor to hero
- heal_heal_hero: telemetry.data.reduce((acc, ev) =>
+ heal_heal: telemetry.data.reduce((acc, ev) =>
ev.actor == p
&& ev.type == "HealTarget"
- && ev.payload.TargetIsHero == 1
? acc + ev.payload.Heal
: acc
, 0),
// actual heal from actor to hero
- heal_healed_hero: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "HealTarget"
- && ev.payload.TargetIsHero == 1
- ? acc + ev.payload.Healed
- : acc
- , 0),
- // theoretical heal from actor to ally
- heal_heal_ally: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.target != p
- && ev.type == "HealTarget"
- && ev.payload.TargetIsHero == 1
- ? acc + ev.payload.Healed
- : acc
- , 0),
- // actual heal from actor to ally
- heal_healed_ally: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.target != p
- && ev.type == "HealTarget"
- && ev.payload.TargetIsHero == 1
- ? acc + ev.payload.Healed
- : acc
- , 0),
- // theoretical heal from actor to other
- heal_heal_other: telemetry.data.reduce((acc, ev) =>
- ev.actor == p
- && ev.type == "HealTarget"
- && ev.payload.TargetIsHero != 1
- ? acc + ev.payload.Heal
- : acc
- , 0),
- // actual heal from actor to other
- heal_healed_other: telemetry.data.reduce((acc, ev) =>
+ heal_healed: telemetry.data.reduce((acc, ev) =>
ev.actor == p
&& ev.type == "HealTarget"
- && ev.payload.TargetIsHero != 1
? acc + ev.payload.Healed
: acc
, 0),
// theoretical heal received from hero
- heal_rcvd_heal_hero: telemetry.data.reduce((acc, ev) =>
- ev.target == p
- && ev.type == "HealTarget"
- && ev.payload.IsHero == 1
- ? acc + ev.payload.Heal
- : acc
- , 0),
- // actual heal received from hero
- heal_rcvd_healed_hero: telemetry.data.reduce((acc, ev) =>
- ev.target == p
- && ev.type == "HealTarget"
- && ev.payload.IsHero == 1
- ? acc + ev.payload.Healed
- : acc
- , 0),
- // theoretical heal received from ally
- heal_rcvd_heal_ally: telemetry.data.reduce((acc, ev) =>
+ heal_rcvd_heal: telemetry.data.reduce((acc, ev) =>
ev.target == p
- && ev.actor != p
&& ev.type == "HealTarget"
- && ev.payload.IsHero == 1
? acc + ev.payload.Heal
: acc
, 0),
// actual heal received from hero
- heal_rcvd_healed_ally: telemetry.data.reduce((acc, ev) =>
+ heal_rcvd_healed: telemetry.data.reduce((acc, ev) =>
ev.target == p
- && ev.actor != p
&& ev.type == "HealTarget"
- && ev.payload.IsHero == 1
? acc + ev.payload.Healed
: acc
, 0),
// lifesteal
- heal_rcvd_healed_vamp: telemetry.data.reduce((acc, ev) =>
+ heal_rcvd_vamp: telemetry.data.reduce((acc, ev) =>
ev.actor == p
&& ev.type == "Vampirism"
? acc + ev.payload.Vamp
: acc
- , 0),
- // theoretical heal received from minion
- heal_rcvd_heal_other: telemetry.data.reduce((acc, ev) =>
- ev.target == p
- && ev.type == "HealTarget"
- && ev.payload.IsHero != 1 // TODO open an issue, is "-1" not "0"
- ? acc + ev.payload.Heal
- : acc
- , 0),
- // actual heal received from minion
- heal_rcvd_healed_other: telemetry.data.reduce((acc, ev) =>
- ev.target == p
- && ev.type == "HealTarget"
- && ev.payload.IsHero != 1
- ? acc + ev.payload.Healed
- : acc
- , 0),
+ , 0)
} });
participant_phase_records = participant_phase_records.concat(
- participants_phase); // TODO calc stats
+ participants_phase);
}, { concurrency: MAXCONNS });
let transaction_profiler = logger.startTimer();