{"id":28855344,"url":"https://github.com/firebaseextended/fcm-external-prober","last_synced_at":"2025-10-03T17:41:16.229Z","repository":{"id":57538758,"uuid":"261542498","full_name":"FirebaseExtended/fcm-external-prober","owner":"FirebaseExtended","description":null,"archived":true,"fork":false,"pushed_at":"2024-03-13T21:02:58.000Z","size":385,"stargazers_count":4,"open_issues_count":2,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-19T23:04:51.681Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FirebaseExtended.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"contributing.md","funding":null,"license":"LICENSE","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-05T17:43:03.000Z","updated_at":"2025-05-19T22:53:52.000Z","dependencies_parsed_at":"2024-06-20T12:58:50.827Z","dependency_job_id":"2a0a4b60-80c2-4ef5-b099-5a13604eb62b","html_url":"https://github.com/FirebaseExtended/fcm-external-prober","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/FirebaseExtended/fcm-external-prober","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FirebaseExtended%2Ffcm-external-prober","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FirebaseExtended%2Ffcm-external-prober/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FirebaseExtended%2Ffcm-external-prober/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FirebaseExtended%2Ffcm-external-prober/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FirebaseExtended","download_url":"https://codeload.github.com/FirebaseExtended/fcm-external-prober/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FirebaseExtended%2Ffcm-external-prober/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260845815,"owners_count":23071685,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-19T23:04:25.826Z","updated_at":"2025-10-03T17:41:16.211Z","avatar_url":"https://github.com/FirebaseExtended.png","language":"Go","readme":"# FCM External Prober\n\n## About\n\nFCM External Prober is a tool that can be used to monitor the performance of FCM by way of repeatedly sending messages to an emulated Android app, which logs its reception of the messages, and calculating the time it took to receive the message, providing measurements of both availability and latency.\n\n## How to Run:\n\nIn the `Controller/src` directory, call `go run main.go -config=\"\u003cconfigPath\u003e\"` where `configPath` is the path to your configuration file.\n\n## How to Stop:\n\nThis program can be teriminated using `^C`. If invoked before VMs are created, the program will terminate normally. If invoked after VMs are created, the prober will allow any outstanding probes to be resolved, and will then delete any regional VMs created during its runtime.\n\n## Requirements to Run:\n\n### Google Cloud Platform\n\nThis tool is designed to run on GCP. It utilizes Compute Engine VM instances, the gcloud CLI tool, IAM service accounts, and exports logs to Cloud Logger. Thus, a GCP account is required.\n\n#### Compute Engine\n\nThis tool requires a VM instance on which to run the controller, and an image from which to generate the VM instances on which probes will run.\n\n#### Image\n\nThe image for regional VMs should have the following dependencies installed and their executables available via PATH:\n* Android SDK\n    * `emulator`\n    * `sdkmanager`\n    * `avdmanager`\n    * `adb` (Android Debug Bridge)\n* Java JDK\n* Golang\n* Git\n* Protocol Buffer compiler with gRPC plugin installed\n\nIn addition, nested virtualization needs to be enabled on this image in order to run the Android app. A guide for how to enable this can be found [here](https://cloud.google.com/compute/docs/instances/enable-nested-virtualization-vm-instances).\n\nIf you want to use FCMExternalProberTarget as your logging app, the package name will need to be changed in order to register the app with FCM, and the google-services.json file should be located on the image or retrieved by the startup script.\nIn order to install your custom logging app on the emulated device, an apk of the logging app should be present on the image, or can be retrieved from an external source with the startup script.\n\nIf you are planning to run this tool with multiple regional VMs, you must generate a new Android Virtual Device during the execution of the startup script. If an AVD saved to an image is utilized by multiple regional VMs, it will create a conflict when registering devices with FCM when the app starts.\n\n#### Startup Script\n\nA startup script is used to install dependencies and begin probing once a regional VM has been created. A generic startup script is included in this repository, but the script is ultimately app- and configuration-specific, so changes are likely needed in order for this tool to function properly. The general requirements for the startup script are as follows:\n* Acquire the most recent version of this repository\n* Acquire a version of a logging app to install on the emulated device\n* Create a new AVD with a desired version of Android\n* Compile Protocol Buffers in `Controller/src/controller`\n* Initiate probing by running `main.go` in `Probe/src`\n\n#### IAM Service Account\n\nThis tool utilizes service accounts to handle authentication to other GCP services. Thus, a service account needs to be created with the following permissions:\n* Compute Engine - Compute Admin\n* Logging - Log writer\n* Firebase Products - Firebase Cloud Messaging Admin\n\n## Operating Costs\n\nThe operating cost of the prober is correlated to the number of regions in which probes are designated. Emulating the Android app is relatively expensive, so an n1-standard-4 machine type is used. A VM with this configuration costs roughly $100.00 to run on a per-monthly basis. The VM on which the controller runs needs fewer resources, so an n1-standard-2 machine would likely suffice.\n\n\n## Source Code Headers\n\nEvery file containing source code must include copyright and license\ninformation. This includes any JS/CSS files that you might be serving out to\nbrowsers. (This is to help well-intentioned people avoid accidental copying that\ndoesn't comply with the license.)\n\nApache header:\n\n    Copyright 2020 Google LLC\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n        https://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffirebaseextended%2Ffcm-external-prober","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffirebaseextended%2Ffcm-external-prober","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffirebaseextended%2Ffcm-external-prober/lists"}