Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ services:
- redis
volumes:
- ./experimenter:/experimenter
- /experimenter/experimenter/glean/generated/
- ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro
command: bash -c "/experimenter/bin/wait-for-it.sh db:5432 -- celery -A experimenter worker -l DEBUG"

Expand All @@ -84,6 +85,7 @@ services:
- redis
volumes:
- ./experimenter:/experimenter
- /experimenter/experimenter/glean/generated/
- ${GOOGLE_ADC_FILE}:${GOOGLE_APPLICATION_CREDENTIALS}:ro
command: bash -c "/experimenter/bin/wait-for-it.sh db:5432 -- celery -A experimenter beat -s /tmp/celerybeat-schedule -l DEBUG"

Expand Down
4 changes: 3 additions & 1 deletion experimenter/experimenter/glean/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from experimenter.glean.generated.server_events import (
create_page_view_server_event_logger,
)
from experimenter.glean.utils import get_request_ip
from experimenter.glean.utils import emit_record, get_request_ip


class GleanMiddleware:
Expand All @@ -18,6 +18,8 @@ def __init__(self, get_response):
app_display_version=settings.APP_VERSION,
channel=settings.GLEAN_APP_CHANNEL,
)
# override glean's emit_record method to make writes to stdout atomic
self.page_view_ping.emit_record = emit_record

def __call__(self, request):
if (
Expand Down
19 changes: 19 additions & 0 deletions experimenter/experimenter/glean/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
import json
from datetime import datetime
from sys import stdout
from typing import Any

from experimenter.glean.generated.server_events import GLEAN_EVENT_MOZLOG_TYPE


def get_request_ip(request) -> None | str:
if xff := request.META.get("HTTP_X_FORWARDED_FOR"):
# Only trust the last 3 values in XFF because they are added by the Google Cloud
# Load Balancer and nginx, and use the least recent of those values.
return xff.rsplit(",", 4)[-3:][0]
return request.META.get("REMOTE_ADDR")


def emit_record(now: datetime, ping: dict[str, Any]):
ping_envelope = {
"Timestamp": now.isoformat(),
"Logger": "glean",
"Type": GLEAN_EVENT_MOZLOG_TYPE,
"Fields": ping,
}
ping_envelope_serialized = f"{json.dumps(ping_envelope)}\n"
stdout.write(ping_envelope_serialized)
Comment on lines +17 to +25
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the original method is:

 def emit_record(self, now: datetime, ping:dict[str, Any]) -> None:
        """Log the ping to STDOUT.
        Applications might want to override this method to use their own logging.
        If doing so, make sure to log the ping as JSON, and to include the
        `Type: GLEAN_EVENT_MOZLOG_TYPE`."""
        ping_envelope = {
            "Timestamp": now.isoformat(),
            "Logger": "glean",
            "Type": GLEAN_EVENT_MOZLOG_TYPE,
            "Fields": ping,
        }
        ping_envelope_serialized = json.dumps(ping_envelope)

        print(ping_envelope_serialized)

18 changes: 13 additions & 5 deletions experimenter/experimenter/glean/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,26 @@
create_data_collection_opt_out_server_event_logger,
)
from experimenter.glean.models import Prefs
from experimenter.glean.utils import get_request_ip
from experimenter.glean.utils import emit_record, get_request_ip


def patch_emit_record(glean_logger):
"""Override glean's emit_record method to make writes to stdout atomic."""
glean_logger.emit_record = emit_record
return glean_logger


class OptOutView(UpdateView):
model = Prefs
fields = ["opt_out"]
template_name = "glean/opt_out_button.html"

data_collection_opt_out_ping = create_data_collection_opt_out_server_event_logger(
application_id=settings.GLEAN_APP_ID,
app_display_version=settings.APP_VERSION,
channel=settings.GLEAN_APP_CHANNEL,
data_collection_opt_out_ping = patch_emit_record(
create_data_collection_opt_out_server_event_logger(
application_id=settings.GLEAN_APP_ID,
app_display_version=settings.APP_VERSION,
channel=settings.GLEAN_APP_CHANNEL,
)
)

def get_object(self, queryset=None):
Expand Down