Sentry-javascript: Petunjuk untuk pelaporan offline?

Dibuat pada 31 Okt 2014  ·  27Komentar  ·  Sumber: getsentry/sentry-javascript

Hai, kami memiliki aplikasi web dengan kemampuan offline yang diterapkan, dan akan sangat bagus jika menggunakan Sentry untuk pemantauan aplikasi. Kami sudah menggunakannya untuk bagian belakang kami dan itu berfungsi dengan baik!

Sayangnya saya tidak melihat dukungan di raven js untuk ini, jadi saya pikir kami akan dipaksa untuk meluncurkan solusi kami sendiri. Bisakah Anda mengkonfirmasi ini? Apa yang akan menjadi saran Anda tentang bagaimana untuk melanjutkan? Apakah Anda merekomendasikan mencoba menggunakan kembali beberapa logika dari raven js?

Komentar yang paling membantu

Solusi kami:

Lewati shouldSendCallback ke Raven init

Jika tidak ada koneksi, keluar logStorageService akan menyimpan data acara

var options = {
    ...
    shouldSendCallback: function(data) {
        if (connectionStatus.check() && Raven.isSetup()) {
            return true;
        } else {
            // store log data somewhere
            logStorageService.set(data);
            return false;
        }
    }
    ...
};

Raven.config(SENTRY_KEY, options).install();

Antrian mencoba mengirim log

Antrian menembakkan kode ini setiap 25 detik, akhirnya mengirimkan semua acara ke Sentry

queue.enqueue(function () {
                    logStorageService
                        .getKeys()
                        .then(function (keys) {
                            if (keys && keys[0]) {
                                logStorageService
                                    .get(keys[0])
                                    .then(function (log) {
                                        Raven.captureMessage('', log);
                                        logStorageService.remove(keys[0]);
                                    });
                            }
                            ...
                        });
                });

Semua 27 komentar

Bisakah Anda mendeteksi jika pengguna sedang offline?

Jika demikian, bukan tidak mungkin untuk mengumpulkan acara dan mengantrekannya. Saat pengguna kembali online, kirimkan lagi melalui Raven.captureException .

Saya mungkin bisa membantu dengan cara kerjanya atau menambahkan pengait untuk membantu ini.

Bagus, terima kasih atas kerjasamanya. Saya dapat mendeteksi pengguna sedang online bahkan hanya menguji jangkauan Sentry. Untuk ini saya dapat mendengarkan peristiwa kegagalan transmisi, tetapi bagaimana cara mencoba lagi?

Tentang menggunakan captureException , itu akan baik-baik saja, tetapi saya ingin menjaga handler raven yang sangat baik menyediakan pengecualian yang tidak tertangani. Saya perlu menambahkan beberapa logika tengah antara deteksi kesalahan gagak dan transmisi kesalahan

Yeah, biarkan aku memikirkan ini. Saya pikir ada cara yang bagus agar kita dapat mendukung ini secara otomatis di raven-js, atau menyediakan pengait untuk melakukannya. Saya pikir itu adil.

Saya juga mencari fungsi yang sama. Setelah memeriksa dokumen, tampaknya solusinya adalah menggunakan shouldSendCallback , sesuatu seperti ini:

shouldSendCallback: function(data) {
  localStorage['queued-errors'] = (localStorage['queued-errors'] || []).push(data);
  return false;
}

Dan kemudian dengarkan konektivitas jaringan dan proses antrian menggunakan Raven.captureException :

window.addEventListener('online', checkAndProcessQueue);

Ini sedikit membonceng, tapi saya punya masalah yang sama. Kami tidak dapat melaporkan kesalahan saat klien kehilangan koneksi ke host (meskipun belum tentu offline). Berputar-putar, saya melihat bahwa ada acara ravenFailure yang dipicu di jendela, tetapi saya tidak bisa mendapatkan cukup data dari acara ini untuk mencapai apa yang saya coba lakukan: coba lagi mengirim kesalahan saat gagal.

Saya melihat beberapa kemungkinan pendekatan untuk ini:

  1. Opsi retry per-instance atau per-message, yang mungkin menentukan seberapa sering mencoba lagi mengirim acara, berapa kali mencoba sebelum menyerah, dll.
  2. Callback/callback(s) pada metode captureException(), sendMessage()`, dll. yang dipicu/dipicu pada keberhasilan/kegagalan
  3. Menjanjikan metode-metode itu (meh)
  4. Memicu peristiwa (di mana?) pada kegagalan dan menyediakan konteks yang cukup dalam data peristiwa untuk mencoba mengirim ulang peristiwa itu

Anda mungkin harus memiliki fasilitas penyimpanan offline sehingga pesan kesalahan dapat dikirim di lain waktu. Mungkin bahkan setelah pengguna menutup aplikasi dan kemudian membukanya kembali saat online. Mirip dengan pendekatan "offline pertama":
http://offlinefirst.org/

Saya telah menghadapi masalah yang sama. Pada awalnya, saya ingin menyelesaikannya mirip dengan cara saya memecahkan masalah offline google-analytics dengan service worker . Pendekatan ini dijelaskan dengan baik oleh Google di sini .

Namun, saat menargetkan Cordova, Service Worker mungkin tidak tersedia.
Dan solusi _hacky_ diperlukan. Saya telah datang dengan yang ini:

https://gist.github.com/oliviertasinari/73389727fe58373eef7b63d2d2c5ce5d

import raven from 'raven-js';
import config from 'config';

const SENTRY_DSN = 'https://[email protected]/YYYY';

function sendQueue() {
  const sentryOffline = JSON.parse(window.localStorage.sentryOffline);

  if (sentryOffline.length > 0) {
    raven._send(sentryOffline[0]);
  }
}

// ... 

Saya setuju dengan @webberig. Saya sebenarnya sedikit terkejut ini belum menjadi bagian dari gagak karena cukup mengesankan dalam banyak cara keren lainnya. Bergantung pada arsitektur aplikasi, kemungkinan ada persentase kesalahan yang tidak sepele yang merupakan HASIL offline. Mampu melaporkan itu cukup penting dalam banyak implementasi.

Jadi suara saya adalah bahwa ini harus dipanggang dan otomatis. Ketika ada kesalahan saat mengirim pesan ke penjaga, pesan tersebut harus disimpan dan dicoba lagi nanti (baik pada penghitung waktu, pada suatu acara, atau bahkan hanya pada pengiriman pesan berikutnya jika Anda ingin membuatnya lebih sederhana).

Juga, apa arti label "DDN"?

Saya sebenarnya sedikit terkejut ini belum menjadi bagian dari gagak karena cukup mengesankan dalam banyak cara keren lainnya. Bergantung pada arsitektur aplikasi, kemungkinan ada persentase kesalahan yang tidak sepele yang merupakan HASIL offline.

Benar-benar adil. Tapi saya tidak yakin itu harus dilakukan secara default. Ada banyak skenario di mana, jika skrip tidak dimuat, aplikasi tidak akan berfungsi apa pun yang terjadi. Dan saya akan mengatakan sebagian besar aplikasi langsung tidak berfungsi secara offline, dan jangan berharap untuk itu. Apakah itu praktik yang baik atau tidak adalah hal lain.

Ini semacam mengapa kami tidak mencatat kesalahan AJAX secara default, meskipun sebagian besar pengguna Raven telah menulis kode untuk melakukannya. Tapi kami akan mencoba membuatnya mudah _jika Anda mau_. Dan saya ingin melakukan hal yang sama di sini.

Juga, apa arti label "DDN"?

Tidak yakin. @mattrobenolt?

Keputusan desain diperlukan. :)

Saya tidak yakin itu harus dilakukan secara default.

Ya itu masuk akal.

Tapi kami akan mencoba membuatnya mudah jika Anda mau. Dan saya ingin melakukan hal yang sama di sini.

Jadi, untuk membantu membuat keputusan desain, berikut beberapa pemikirannya:

Jika saya memahami dokumen dengan benar, opsi konfigurasi transport memungkinkan seseorang untuk pada dasarnya mengendalikan bagian terakhir dari pipa tempat Sentry mengirim data ke server dan bertanggung jawab untuk membuat transmisi itu terjadi. Dalam hal ini, sepertinya itu adalah tempat terbaik untuk memasang antrean offline. Alih-alih mengirim data ke server, kirimkan ke antrian yang mengunggah ke server di latar belakang. Itu akan terjadi jika seseorang menulis kode mereka sendiri untuk mewujudkannya.

Dalam nada yang sama, apakah cukup sederhana untuk juga mengekspos opsi konfigurasi ( includeOffline ?) yang akan menggantikan transport HTTP default dengan antrian berkemampuan offline resmi Raven-rolled?

  • Untuk kompatibilitas browser, mungkin simpan antrean di localStorage dan periksa koneksi pada waktu habis.
  • Untuk kinerja dan stabilitas yang lebih baik, mungkin manfaatkan pekerja layanan untuk mengelola antrean sehingga kesalahan bahkan dapat diunggah setelah halaman ditutup. Tetapi apakah sedikit lancang bagi perpustakaan utilitas untuk memutar pekerja layanannya sendiri pada saat ini?

apakah fungsi ini sekarang telah dibangun untuk gagak?

@Freundschaft Tidak, belum. Seperti yang saya pahami, untuk saat ini Anda harus mengganti opsi transport atau menggunakan shouldSendCallback untuk membuat antrian untuk pengiriman nanti.

@cudasteve terima kasih!
seseorang mendapat implementasi sampel yang berfungsi? jika tidak saya akan mencoba menulis satu dan mempostingnya di sini

@Freundschaft ini akan sangat membantu. kita menghadapi masalah yang sama

+1 tolong

+1

+1

Solusi kami:

Lewati shouldSendCallback ke Raven init

Jika tidak ada koneksi, keluar logStorageService akan menyimpan data acara

var options = {
    ...
    shouldSendCallback: function(data) {
        if (connectionStatus.check() && Raven.isSetup()) {
            return true;
        } else {
            // store log data somewhere
            logStorageService.set(data);
            return false;
        }
    }
    ...
};

Raven.config(SENTRY_KEY, options).install();

Antrian mencoba mengirim log

Antrian menembakkan kode ini setiap 25 detik, akhirnya mengirimkan semua acara ke Sentry

queue.enqueue(function () {
                    logStorageService
                        .getKeys()
                        .then(function (keys) {
                            if (keys && keys[0]) {
                                logStorageService
                                    .get(keys[0])
                                    .then(function (log) {
                                        Raven.captureMessage('', log);
                                        logStorageService.remove(keys[0]);
                                    });
                            }
                            ...
                        });
                });

Beberapa contoh di atas menunjukkan panggilan ke fungsi "pribadi". Namun, saya tidak dapat memanggil Raven._sendProcessedPayload atau Raven._send .

Melihat kode sumber Anda, saya bahkan tidak yakin bagaimana Raven() sedang dibangun sebagai objek. Saya tidak melihat "new Raven()" di mana pun.

Bagaimana saya bisa memanggil fungsi-fungsi ini?

Tidak apa-apa, masalah hanya terjadi ketika raven.min.js dan bukan raven.js sehingga menjawab pertanyaan itu.

Jadi, saya mencari nama yang diperkecil untuk fungsi _sendProcessedPayload dan inilah yang saya dapatkan dalam kode saya (untuk saat ini):

  /**
   * HACK: Using a private function that gets minified!
   * Pinned Raven-js to version 3.8.1.
   */
  Raven._sendProcessedPayload = Raven._sendProcessedPayload || Raven.Y;

  ...

  function processQueue(items) {
    // Stop if we're not online.
    if (!canSend())
      return;
    // Process the given items or get them from the queue.
    items = items || queue.getItems();
    if (!items || items.length < 1)
      return;
    // First in, first out.
    var next = items.shift();
    // Send the next item.
    Raven._sendProcessedPayload(next, function processed(error) {
      // If no errors, save the queue and process more items.
      if (!error) {
        queue.save(items);
        processQueue(items);
      }
    });
  }

  function shouldSend(data) {
    if (canSend())
      return true;
    if (data.extra.retry)
      return false;
    data.extra.retry = true;
    queue.add(data);
    return false;
  }

  ...

  setInterval(processQueue, OFFLINE_QUEUE_TIMEOUT);

Ini jauh dari ideal karena HACK yang menghebohkan dan juga karena lebih banyak kesalahan dapat ditangkap saat saya memproses antrian ini, sehingga mereka akan dikirim rusak...

Catatan terakhir untuk hari ini: Saya pikir Anda harus membuat _sendProcessedPayload publik. Itu mengambil tepat di mana _send keluar ketika shouldSendCallback mengembalikan false, jadi itu adalah pilihan yang jelas untuk menelepon jika Anda ingin mencoba lagi mengirim...

Namun, saya tidak suka itu mengubah muatan. Jadi, itu bukan metode yang ideal.

Apakah fitur ini telah ditambahkan ke perpustakaan.

Saya mengalami kebutuhan untuk ini hari ini karena saya memiliki fitur yang mampu offline. Saya menyimpan semua data saya sendiri menggunakan indexdb tetapi akan lebih baik jika memiliki fungsionalitas offline di luar kotak untuk Sentry. Jika itu bisa menggunakan database lokalnya sendiri untuk menyimpan acara dan perubahan jaringan secara berkala/pada upaya untuk mengirim dan menghapus db yang akan sangat berguna.

Jika saya menyimpan pengecualian untuk pengiriman nanti ketika saya online, apakah ada cara bagi saya untuk mengatur stempel waktu pada pengecualian untuk menunjukkan bahwa itu tidak terjadi sekarang ketika saya mengirimnya ke penjaga, tetapi di beberapa titik di masa lalu? Saya kira saya bisa menambahkannya di ekstra, tetapi akan menyenangkan untuk dapat mengatur stempel waktu yang sebenarnya.

Saya tidak melihat opsi seperti itu di captureException

Apakah halaman ini membantu?
0 / 5 - 0 peringkat