web-dev-qa-db-fra.com

Mesurer la bande passante utilisée par le socket Web dans l'application React Native

Dans notre application, le personnel utilise son téléphone pour consigner les activités d'une entreprise. Ils finissent par utiliser 0,5 Go à 2 Go de données par mois en moyenne.

J'essaie de créer dans notre application des fonctionnalités qui enregistrent l'utilisation des données afin que nous puissions les renvoyer à l'entreprise sous la forme d'une demande de remboursement.

Dans l'exemple de code ci-dessous, comment puis-je déterminer la quantité de bande passante/de données utilisée par le périphérique qui envoie le message sur une WebSocket?

var ws = new WebSocket('ws://Host.com/path');

ws.onopen = () => {
  ws.send('something');
};
7
jskidd3

En supposant que vous puissiez identifier une session client par une adresse IP unique (uniquement la session, ils n'ont pas toujours besoin de cette adresse IP), je vous recommanderais d'utiliser des outils de bas niveau mieux adaptés à votre application, notamment les collecteurs NetFlow.

NetFlow mesure TCP 'conversation', via l'enregistrement de src IP, dst et débit sur une tranche de temps. Vous pouvez l'activer dans un noyau Linux ou directement dans certains équipements de réseau. Vous aurez ensuite besoin d'un programme pour collecter et stocker les données.

En supposant que la collecte NetFlow soit activée et que vous puissiez identifier les sessions par IP, vous pouvez effectuer les opérations suivantes:

  1. Enregistrez l'heure, l'ID utilisateur et leur adresse IP au début d'une session
  2. En utilisant ces données, vous pouvez ensuite interroger vos journaux NetFlow et obtenir le débit 

La raison pour laquelle je suggère cela au lieu d'une sorte de solution en espace utilisateur qui pourrait compter les octets reçus (ce que vous pourriez probablement faire assez facilement) est parce que de nombreuses données sont extraites par les bibliothèques et le noyau. Le noyau gère la pile TCP (y compris le renvoi des paquets manqués), les bibliothèques gèrent le protocole de transfert/chiffrement TLS ainsi que le protocole de transfert WebSocket. Toutes ces données sont comptées dans les données utilisées par l'utilisateur. La manière dont les utilisateurs utilisent l'application affectera la quantité de données de traitement qui sera envoyée (en l'ouvrant/le fermant constamment ou en la laissant ouverte). 

6
Liam Kelly

Cela dépend de la précision dont vous avez besoin. Le moyen le plus simple serait de "sous-classer" les sockets existants par quelque chose comme:

var inboundTraffic = 0;
var outboundTraffic = 0;

function NewWebSocket(addr) {
  var ws = new WebSocket(addr);
  var wsSend = ws.send;
  ws.send = function(data) { 
    outboundTraffic += data.length; 
    return wsSend.call(ws,data); 
  }
  ws.addEventListener("message", function (event) {
    inboundTraffic += event.data.length;
  });
  return ws;
}

Simple et ne coûte pratiquement rien.

1
c-smile