def add_favorite_movie()

in Elastiflix/python-favorite-otel-manual/main.py [0:0]


def add_favorite_movie():
    # add artificial delay if enabled
    if delay_time > 0:
        time.sleep(max(0, random.gauss(delay_time / 1000, delay_time / 1000 / 10)))

    with tracer.start_as_current_span("add_favorite_movies", set_status_on_exception=True) as span:
        user_id = str(request.args.get("user_id"))
        movie_id = request.json["id"]

        logger.info(
            "Adding or removing favorites for user " + user_id,
            extra={"event.dataset": "favorite.log", "user.id": user_id},
        )

        # add movie to the user's favorite list. If it already exists, remove it from the list
        redisRespone = r.srem(user_id, int(movie_id))
        if redisRespone == 0:
            r.sadd(user_id, movie_id)
        favorites = r.smembers(user_id)

        # convert to list
        favorites = list(favorites)

        logger.info(
            "User " + user_id + " has favorites: " + str(favorites),
            extra={"event.dataset": "favorite.log", "user.id": user_id},
        )

        # if enabled, in 50% of the cases, sleep for 2 seconds
        sleep_time = os.getenv("TOGGLE_CANARY_DELAY")
        if sleep_time is None or sleep_time == "":
            sleep_time = 0
        sleep_time = int(sleep_time)

        if sleep_time > 0 and random.random() < 0.5:
            time.sleep(max(0, random.gauss(sleep_time / 1000, sleep_time / 1000 / 10)))
            # add label to transaction
            logger.info("Canary enabled")
            # add label to span using opentelemetry
            span.set_attribute("canary", "test-new-feature")
            span.set_attribute("quiz_solution", "correlations")

            if random.random() < float(os.getenv("TOGGLE_CANARY_FAILURE", 0)):
                # throw an exception in 50% of the cases
                logger.error("Something went wrong")
                # set the span status to error

                raise Exception("Something went wrong")

        return {"favorites": favorites}